1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include<cstdio> #include<cstring> #define cl(x,y) memset(x,y,sizeof(x)) #include<algorithm> using namespace std;
const int maxn=5005,maxe=10005; int tst,n,q,b[maxn]; int son[maxe],nxt[maxe],lnk[maxn],tot; inline void add(int x,int y){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot; } int f[maxn][maxn],g[maxn][maxn],siz[maxn]; void dfs(int x,int fa){ siz[x]=1; f[x][1]=g[x][1]=b[x]; for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=fa){ dfs(son[j],x); for (int i=siz[x];i;i--) for (int k=siz[son[j]];k;k--) f[x][i+k]=min(f[x][i+k],f[x][i]+f[son[j]][k]), g[x][i+k]=max(g[x][i+k],g[x][i]+g[son[j]][k]); siz[x]+=siz[son[j]]; } for (int i=1;i<=n;i++) f[0][i]=min(f[0][i],f[x][i]),g[0][i]=max(g[0][i],g[x][i]); } int main(){ scanf("%d",&tst); while (tst--){ scanf("%d%d",&n,&q); tot=0,cl(lnk,0); for (int i=1,x,y;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x); for (int i=1;i<=n;i++) scanf("%d",&b[i]); cl(f,63);cl(g,192); dfs(1,0); while (q--){ int x,y;scanf("%d%d",&x,&y); if (f[0][x]<=y&&y<=g[0][x]) puts("YES");else puts("NO"); } puts(""); } return 0; }
|