Let ' s Orz Yts
//#pragma comment (linker, "/stack:20240000,20240000")#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <vector>#include <cmath>#include <ctime>#include <queue>#include <set>#include <map>#define N 500005using namespace STD;BOOLmark[n][ A];inthead[n],nxt[n<<1],lst[n<<1];intf[n][ A],g[n][ A],w[n];intN,d,m,tot;voidInsertintXintY) {lst[++tot]=y; nxt[tot]=head[x]; head[x]=tot; Lst[++tot]=x; Nxt[tot]=head[y]; Head[y]=tot;}voidDfsintXintFA) {intflag=1; for(intI=head[x];i;i=nxt[i])if(LST[I]!=FA) {flag=0, DFS (LST[I],X); for(intj=1; j<=d;j++) mark[x][j]|=mark[lst[i]][j-1]; }if(flag) {f[x][0]=g[x][0]=w[x]*mark[x][0]; for(intI=1; i<=d;i++) f[x][i]=0, G[x][i]=w[x];return; } for(intI=1; i<=d;i++) for(intJ=HEAD[X];J;J=NXT[J])if(LST[J]!=FA) f[x][i]+=f[lst[j]][i-1]; for(intI=head[x];i;i=nxt[i])if(LST[I]!=FA) g[x][d]+=f[lst[i]][d]; G[X][D]+=W[X]; for(inti=d-1; i>=0; i--) {intsum=0; for(intJ=HEAD[X];J;J=NXT[J])if(LST[J]!=FA) sum+=f[lst[j]][i]; g[x][i]=g[x][i+1]; for(intJ=HEAD[X];J;J=NXT[J])if(LST[J]!=FA) G[x][i]=min (g[x][i],g[lst[j]][i+1]+sum-f[lst[j]][i]); } f[x][0]=g[x][0]; for(intI=1; i<=d;i++) F[x][i]=min (f[x][i],f[x][i-1]); for(inti=d-1; i>=0; i--)if(!mark[x][i]) f[x][i]=min (f[x][i],f[x][i+1]); g[x][0]=f[x][0];}intMain () {scanf("%d%d", &n,&d); for(intI=1; i<=n;i++)scanf("%d", &w[i]);scanf("%d", &m); for(intI=1; i<=m;i++) {intXscanf("%d", &x); mark[x][0]=1; } for(intI=1; i<n;i++) {intx, y;scanf("%d%d", &x,&y); Insert (x, y); } DFS (1,0);cout<<f[1][0]<<endl;return 0;}
4557: [JLoi2016] Reconnaissance Guard | Tree DP