BZOJ 5072: [Lydsy十月月赛]小A的树 树形dp

来源:互联网 发布:视觉算法工程师 编辑:程序博客网 时间:2024/06/08 12:35


...懒...


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<map>#include<set>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=5010;int last[N],ecnt;struct EDGE{int to,nt;}e[N<<1];inline void add(int u,int v){e[++ecnt]=(EDGE){v,last[u]};last[u]=ecnt;}int size[N],fa[N];int V[N],f[N][N],g[N][N],ff[N],gg[N],sf[N],sg[N];void dfs(int u){size[u]=1;f[u][1]=g[u][1]=V[u];for(int i=last[u];i;i=e[i].nt)if(fa[u]^e[i].to){fa[e[i].to]=u;dfs(e[i].to);memcpy(ff,f[u],sizeof(ff));memcpy(gg,g[u],sizeof(gg));for(int j=1;j<=size[u];++j)for(int k=1;k<=size[e[i].to];++k)ff[j+k]=max(ff[j+k],f[u][j]+f[e[i].to][k]),gg[j+k]=min(gg[j+k],g[u][j]+g[e[i].to][k]);size[u]+=size[e[i].to];for(int j=1;j<=size[u];++j)f[u][j]=ff[j],g[u][j]=gg[j];}for(int i=1;i<=size[u];++i)sf[i]=max(sf[i],f[u][i]),sg[i]=min(sg[i],g[u][i]);}void initial(){ecnt=0;memset(last,0,sizeof(last));memset(f,0,sizeof(f));memset(g,0X3f,sizeof(g));memset(sf,0,sizeof(sf));memset(sg,0X3f,sizeof(sg));}int main(){int T=read();while(T--){initial();int n=read();int Q=read();for(int u,v,i=1;i<n;++i){u=read();v=read();add(u,v);add(v,u);}for(int i=1;i<=n;++i)V[i]=read();dfs(1);while(Q--){int x=read(),y=read();if(y<=sf[x]&&y>=sg[x])puts("YES");else puts("NO");}puts("");}return 0;}/*19 44 11 51 23 23 66 76 89 60 1 0 1 0 0 1 0 13 27 34 09 5YESYESNONO*/


阅读全文
0 0
原创粉丝点击