1. 程式人生 > >【模板】點分治

【模板】點分治

one char read 圖片 http sin gis alt +=

洛谷 3806

技術分享圖片

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 10010
 5 #define rg register
 6 using namespace std;
 7 int n,m,k,cnt,tot,root,dep[N],siz[N],mxsiz[N],last[N],q[110];
 8 bool v[N],have[10000010],ans[110];
 9 struct edge{
10     int to,pre,dis;
11 }e[N<<1
]; 12 inline int read(){ 13 int k=0,f=1; char c=getchar(); 14 while(c<0||c>9)c==-&&(f=-1),c=getchar(); 15 while(0<=c&&c<=9)k=k*10+c-0,c=getchar(); 16 return k*f; 17 } 18 void getroot(int x,int fa){ 19 siz[x]=1; mxsiz[x]=0; 20 for(rg int i=last[x],to;i;i=e[i].pre)if
(!v[to=e[i].to]&&to!=fa){ 21 getroot(to,x); siz[x]+=siz[to]; 22 mxsiz[x]=max(mxsiz[x],siz[to]); 23 } 24 mxsiz[x]=max(mxsiz[x],cnt-mxsiz[x]); 25 if(!root||mxsiz[x]<mxsiz[root]) root=x; 26 } 27 void getdep(int x,int fa,int d){ 28 dep[tot++]=d; 29 for(rg int
i=last[x],to;i;i=e[i].pre) 30 if(!v[to=e[i].to]&&to!=fa) getdep(to,x,d+e[i].dis); 31 } 32 void dfs(int x){ 33 v[x]=1; int l=tot=1; have[0]=1; 34 for(rg int i=last[x],to;i;i=e[i].pre)if(!v[to=e[i].to]){ 35 l=tot; getdep(to,x,e[i].dis); 36 for(rg int k=1;k<=m;k++){ 37 if(ans[k]) continue; 38 for(rg int j=l;j<tot;j++) 39 if(q[k]>=dep[j]) if(have[q[k]-dep[j]]) ans[k]=1; 40 } 41 for(rg int j=l;j<tot;j++) have[dep[j]]=1; 42 } 43 for(rg int i=1;i<tot;i++) have[dep[i]]=0; 44 for(rg int i=last[x],to;i;i=e[i].pre)if(!v[to=e[i].to]){ 45 root=0; cnt=siz[to]; getroot(to,x); dfs(root); 46 } 47 } 48 int main(){ 49 n=read(); m=read(); 50 for(rg int i=1;i<n;i++){ 51 int u=read(),v=read(),w=read(); 52 e[++tot]=(edge){v,last[u],w}; last[u]=tot; 53 e[++tot]=(edge){u,last[v],w}; last[v]=tot; 54 } 55 for(rg int i=1;i<=m;i++) q[i]=read(); 56 root=0; cnt=n; getroot(1,0); dfs(root); 57 for(rg int i=1;i<=m;i++) puts(ans[i]?"AYE":"NAY"); 58 return 0; 59 }
View Code

【模板】點分治