题解:P16356 「Diligent-OI R3 D」神秘树
一句话剪枝,暴力变 AC!暴踩 std,一秒水紫题!!
在暴力 DP 基础上加一句话剪枝复杂度就可以变成
暴力 DP 是设
加上这么一个判断:如果
先放代码:
#include <bits/stdc++.h>
using namespace std;
#define N 300005
int n,L,u,v,a[N],d[N];
long long f[N];
vector<int> g[N];
void zhuanyi(int u,int fa,int x){
if(d[u]>d[x]+L)return;
f[x]=max(f[x],f[u]+a[x]%a[u]);
if(a[u]*2>a[x])return; //一句话剪枝,暴力变AC!!
for(int v:g[u])
if(v!=fa)zhuanyi(v,u,x);
}
void dfs(int u,int fa){
for(int v:g[u])
if(v!=fa)d[v]=d[u]+1,dfs(v,u),zhuanyi(v,u,u);
}
int main(){
cin>>n>>L;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
dfs(1,0);
cout<<f[1]<<endl;
}
为什么这样剪枝是对的?因为如果
为什么复杂度就是 zhuanyi 次数是