点分治成品
https://www.luogu.org/problemnew/show/P2664
#include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define pqueue priority_queue #define NEW(a,b) memset(a,b,sizeof(a)) #define lowbit(x) (x&(-x)) #define si(x) scanf("%d",&x) #define sl(x) scanf("%lld",&x) #define lc (d<<1) #define rc (d<<1|1) const double pi=4.0*atan(1.0); const double e=exp(1.0); const int maxn=1e4+8; typedef long long LL; typedef unsigned long long ULL; const LL mod=1e9+7; const ULL base=1e7+7; using namespace std; struct node{ int to,nxt; LL val; }g[maxn*2]; LL q[maxn]; int head[maxn],cnt=0; int Siz[maxn],son[maxn]; int Size,mx,root,num; bool vis[maxn],used[maxn*1000]; LL ans,kk; void add(int x,int y,LL val){ g[cnt].to=y; g[cnt].nxt=head[x]; g[cnt].val=val; head[x]=cnt++; } //求重心 void Findroot(int u,int fa){ Siz[u]=1; son[u]=0; int t=head[u]; while(t!=-1){ if(g[t].to!=fa&&!vis[g[t].to]){ Findroot(g[t].to,u); Siz[u]+=Siz[g[t].to]; son[u]=max(son[u],Siz[g[t].to]); } t=g[t].nxt; } son[u]=max(son[u],Size-Siz[u]); if(son[u]<mx) mx=son[u],root=u; } LL solve(int u,int fa,int k,int v){ if(k<=kk) q[++num]=k; if(u==v) used[k]=1; int gg=num; int t=head[u]; while(t!=-1){ if(g[t].to!=fa&&!vis[g[t].to]){ solve(g[t].to,u,k+g[t].val,v); if(u==v){ for(int i=gg+1;i<=num;i++){ if(kk-q[i]>=0&&used[kk-q[i]]){ return 1; } } for(int i=gg+1;i<=num;i++){ used[q[i]]=1; } gg=num; } } t=g[t].nxt; } return 0; } //点分治 void Divide(int u){ for(int i=1;i<=num;i++){ used[q[i]]=0; } num=0; ans+=solve(u,0,0,u); if(ans) return ; int t=head[u]; vis[u]=1; while(t!=-1){ if(vis[g[t].to]){ t=g[t].nxt; continue; } mx=INF; Size=Siz[g[t].to]; root=u; Findroot(g[t].to,u); Divide(root); t=g[t].nxt; } } int main(){ int n,m; int x,y; LL val; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<n;i++){ scanf("%d%d%lld",&x,&y,&val); add(x,y,val); add(y,x,val); } for(int i=1;i<=m;i++){ scanf("%lld",&kk); ans=0; for(int j=1;j<=n;j++) vis[j]=0; Size=n; mx=INF; Findroot(1,0); Divide(root); if(ans) cout<<"AYE"<<endl; else cout<<"NAY"<<endl; } }