[BZOJ 5072][Lydsy1710月赛]小A的树

传送门

树形dp,注意赋初值

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define rep(i,a,b) for(int i=a;i<=b;++i)
 4 #define fgr(i,u) for(int i=head[u];i;i=to[i])
 5 #define fd(i,a,b) for(int i=a;i>=b;--i)
 6 const int maxn=5010;
 7 template <typename T> inline bool check_Max(T &x,const T&y) {return x<y?x=y,false:true;}
 8 template <typename T> inline bool check_Min(T &x,const T&y) {return x>y?x=y,false:true;}
 9 inline int gi() {
10     int x=0; char o; bool f=true; for(;!isdigit(o=getchar());)if(o=='-')f=false;
11     for(;isdigit(o);o=getchar()) x=(x<<1)+(x<<3)+(o&15); return f?x:~x+1;
12 }
13 int v[maxn<<1],to[maxn<<1],head[maxn],p;
14 inline void link(int a,int b){v[++p]=b; to[p]=head[a]; head[a]=p;}
15 int sz[maxn],col[maxn],Tx[maxn],Tn[maxn],g[maxn][maxn],f[maxn][maxn];
16 int n,m;
17 inline void dfs(int u,int pre) {
18     sz[u]=1; g[u][1]=f[u][1]=col[u];
19     fgr(i,u) if(v[i]^pre) {
20         dfs(v[i],u); 
21         fd(j,sz[u],1) fd(k,sz[v[i]],1)
22             check_Max(f[u][j+k],f[u][j]+f[v[i]][k]), check_Min(g[u][j+k],g[u][j]+g[v[i]][k]);
23         sz[u]+=sz[v[i]];
24     }
25     rep(i,1,n) check_Max(Tx[i],f[u][i]),check_Min(Tn[i],g[u][i]);
26 }
27 int T;
28 int main() {
29 #ifndef ONLINE_JUDGE
30     freopen("1.in","r",stdin);
31 #endif
32     T=gi();
33     while(T--) {
34         n=gi(); m=gi(); 
35         memset(f,0xc0,sizeof(f)); memset(g,0x3f,sizeof(g)); memset(head,0,sizeof(head));
36         memset(Tn,0x3f,sizeof(Tn)); memset(Tx,0xc0,sizeof(Tx)); p=0;
37         //printf("%d\n",f[0][0]);//de bug
38         rep(i,2,n) {int u=gi(),v=gi(); link(u,v); link(v,u);}
39         rep(i,1,n) col[i]=gi();
40         dfs(1,0);
41         rep(i,1,m) {int x=gi(),y=gi(); Tx[x]>=y&&Tn[x]<=y?puts("YES"):puts("NO");}
42         puts("");
43     }
44     return 0;
45 }

猜你喜欢

转载自www.cnblogs.com/miecoku/p/9778558.html
今日推荐