点分治
ref:https://blog.csdn.net/qq_39553725/article/details/77542223
ref:https://www.cnblogs.com/qt666/p/6597276.html
ref:http://hzwer.com/category/algorithm/graph-theory/tree/some-divide-and-conquer
1.Luogu P4178 Tree
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define inf 0x7fffffff 5 #define MN 40005 6 using namespace std; 7 inline int in(){ 8 int x=0;bool f=0; char c; 9 for (;(c=getchar())<'0'||c>'9';f=c=='-'); 10 for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0'); 11 return f?-x:x; 12 } 13 struct edge{ 14 int to,nxt,val; 15 }e[MN<<1]; 16 int h[MN],siz[MN],mx[MN],dep[MN],dis[MN]; 17 int n,k,x,y,v,rt,ans,sum,cnt,tot; 18 bool vis[MN]; 19 inline void ins(int x,int y,int v){ 20 e[++cnt].to=y;e[cnt].nxt=h[x];h[x]=cnt;e[cnt].val=v; 21 } 22 inline void getrt(int u,int fa){ 23 siz[u]=1;mx[u]=0; 24 for (int i=h[u];i;i=e[i].nxt){ 25 int v=e[i].to; 26 if (v==fa||vis[v]) continue; 27 getrt(v,u);siz[u]+=siz[v]; 28 mx[u]=max(mx[u],siz[v]); 29 }mx[u]=max(mx[u],sum-siz[u]); 30 if (mx[u]<mx[rt]) rt=u; 31 } 32 inline void getdep(int u,int fa){ 33 dep[++tot]=dis[u]; 34 for (int i=h[u];i;i=e[i].nxt){ 35 int v=e[i].to; 36 if (v==fa||vis[v]) continue; 37 dis[v]=dis[u]+e[i].val;getdep(v,u); 38 } 39 } 40 inline int calc(int u,int val){ 41 dis[u]=val;tot=0;getdep(u,0); 42 sort(dep+1,dep+tot+1); 43 int l=1,r=tot,res=0; 44 while (l<r){ 45 if (dep[l]+dep[r]<=k) res+=r-l,l++; 46 else r--; 47 }return res; 48 } 49 inline void dfs(int u){ 50 ans+=calc(u,0);vis[u]=1; 51 for (int i=h[u];i;i=e[i].nxt){ 52 int v=e[i].to; 53 if (vis[v]) continue; 54 ans-=calc(v,e[i].val); 55 sum=siz[v];rt=0; 56 getrt(v,0);dfs(rt); 57 } 58 } 59 int main() 60 { 61 n=in();rt=0; 62 for (int i=1;i<n;++i){ 63 x=in();y=in();v=in(); 64 ins(x,y,v);ins(y,x,v); 65 }k=in();sum=n;mx[0]=inf; 66 getrt(1,0);dfs(rt); 67 printf("%d",ans);return 0; 68 }
2.Luogu P3806 点分治1
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define inf 0x7fffffff 5 #define MN 10005 6 using namespace std; 7 inline int in(){ 8 int x=0;bool f=0;char c; 9 for (;(c=getchar())<'0'||c>'9';f=c=='-'); 10 for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0'); 11 return f?-x:x; 12 } 13 struct edge{ 14 int to,nxt,val; 15 }e[MN<<1]; 16 int h[MN],siz[MN],son[MN],dis[MN],dep[MN],b[MN],q[MN],k[MN]; 17 int n,m,x,y,w,rt,cnt,tot,num,sum; 18 bool vis[MN],res[MN]; 19 inline void ins(int x,int y,int v){ 20 e[++cnt].to=y;e[cnt].nxt=h[x];h[x]=cnt;e[cnt].val=v; 21 } 22 inline void getrt(int u,int fa){ 23 siz[u]=1;son[u]=0; 24 for (int i=h[u];i;i=e[i].nxt){ 25 int v=e[i].to; 26 if (v==fa||vis[v]) continue; 27 getrt(v,u);siz[u]+=siz[v]; 28 son[u]=max(son[u],siz[v]); 29 }son[u]=max(son[u],sum-siz[u]); 30 if (son[u]<son[rt]) rt=u; 31 } 32 inline void getdep(int u,int fa){ 33 dep[++tot]=dis[u]; 34 for (int i=h[u];i;i=e[i].nxt){ 35 int v=e[i].to; 36 if (v==fa||vis[v]) continue; 37 dis[v]=dis[u]+e[i].val;getdep(v,u); 38 } 39 } 40 inline void calc(int u,int val){ 41 tot=0;dis[u]=val;getdep(u,0); 42 sort(dep+1,dep+tot+1); 43 b[0]=0;b[num+1]=inf; 44 for (int j=1;j<=m;++j) 45 for (int i=1;i<=tot;++i){ 46 int pos=lower_bound(b,b+num+2,k[j]-dep[i])-b; 47 if (dep[i]+b[pos]==k[j]) res[j]=1; 48 } 49 int I=1,J=1,K=1; 50 while (I<=tot&&J<=num) 51 if (dep[I]<=b[J]) q[K++]=dep[I++]; 52 else q[K++]=b[J++]; 53 while (I<=tot) q[K++]=dep[I++]; 54 while (J<=num) q[K++]=b[J++]; 55 for (int i=1;i<K;++i) b[i]=q[i];num=K-1; 56 } 57 inline void dfs(int u){ 58 vis[u]=1;num=0; 59 for (int i=h[u];i;i=e[i].nxt){ 60 int v=e[i].to; 61 if (vis[v]) continue; 62 calc(v,e[i].val); 63 } 64 for (int i=h[u];i;i=e[i].nxt){ 65 int v=e[i].to; 66 if (vis[v]) continue; 67 sum=siz[v];rt=0;getrt(v,0);dfs(rt); 68 } 69 } 70 int main() 71 { 72 n=in();m=in(); 73 for (int i=1;i<n;++i){ 74 x=in();y=in();w=in(); 75 ins(x,y,w);ins(y,x,w); 76 } 77 for (int i=1;i<=m;++i) k[i]=in(); 78 rt=0;sum=n;son[0]=inf; 79 getrt(1,0);dfs(rt); 80 for (int i=1;i<=m;++i) 81 puts(res[i]?"AYE":"NAY");return 0; 82 }
3.BZOJ 2152/Luogu P2634 聪聪可可
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MN 20005 5 using namespace std; 6 inline int in(){ 7 int x=0;bool f=0;char c; 8 for (;(c=getchar())<'0'||c>'9';f=c=='-'); 9 for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0'); 10 return f?-x:x; 11 } 12 struct edge{ 13 int to,nxt,val; 14 }e[MN<<1]; 15 int h[MN],siz[MN],son[MN],dep[MN],dis[MN]; 16 int n,k,x,y,w,g,rt,ans,sum,cnt,tot,res; 17 bool vis[MN]; 18 inline void ins(int x,int y,int v){ 19 e[++cnt].to=y;e[cnt].nxt=h[x];h[x]=cnt;e[cnt].val=v; 20 } 21 inline int gcd(int x,int y){ 22 return y?gcd(y,x%y):x; 23 } 24 inline void getrt(int u,int fa){ 25 siz[u]=1;son[u]=0; 26 for (int i=h[u];i;i=e[i].nxt){ 27 int v=e[i].to; 28 if (v==fa||vis[v]) continue; 29 getrt(v,u);siz[u]+=siz[v]; 30 son[u]=max(son[u],siz[v]); 31 }son[u]=max(son[u],sum-siz[u]); 32 if (son[u]<son[rt]) rt=u; 33 } 34 inline void getdep(int u,int fa){ 35 ++dep[dis[u]]; 36 for (int i=h[u];i;i=e[i].nxt){ 37 int v=e[i].to; 38 if (v==fa||vis[v]) continue; 39 dis[v]=(dis[u]+e[i].val)%3;getdep(v,u); 40 } 41 } 42 inline int calc(int u,int val){ 43 dep[0]=dep[1]=dep[2]=0; 44 dis[u]=val%3;getdep(u,0); 45 return dep[0]*dep[0]+((dep[1]*dep[2])<<1); 46 } 47 inline void dfs(int u){ 48 res+=calc(u,0);vis[u]=1; 49 for (int i=h[u];i;i=e[i].nxt){ 50 int v=e[i].to; 51 if (vis[v]) continue; 52 res-=calc(v,e[i].val);rt=0; 53 sum=siz[v];getrt(v,0);dfs(rt); 54 } 55 } 56 int main() 57 { 58 n=in(); 59 for (int i=1;i<n;++i){ 60 x=in();y=in();w=in(); 61 ins(x,y,w);ins(y,x,w); 62 }sum=son[0]=n;rt=0; 63 getrt(1,0);dfs(rt);g=gcd(res,n*n); 64 printf("%d/%d",res/g,(n*n)/g);return 0; 65 }
4.Luogu P4149 [IOI2011] Race
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define inf 0x3f3f3f3f 5 #define MN 200005 6 #define MM 1000005 7 using namespace std; 8 inline int in(){ 9 int x=0;bool f=0;char c; 10 for (;(c=getchar())<'0'||c>'9';f=c=='-'); 11 for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0'); 12 return f?-x:x; 13 } 14 struct edge{ 15 int to,nxt,val; 16 }e[MN<<1]; 17 int h[MN],siz[MN],son[MN],dis[MN],dep[MN],len[MM]; 18 int n,k,x,y,w,rt,sum,cnt,res,tot; 19 bool vis[MN]; 20 inline void ins(int x,int y,int v){ 21 e[++cnt].to=y;e[cnt].nxt=h[x];h[x]=cnt;e[cnt].val=v; 22 } 23 inline void getrt(int u,int fa){ 24 siz[u]=1;son[u]=0; 25 for (int i=h[u];i;i=e[i].nxt){ 26 int v=e[i].to; 27 if (v==fa||vis[v]) continue; 28 getrt(v,u);siz[u]+=siz[v]; 29 son[u]=max(son[u],siz[v]); 30 }son[u]=max(son[u],sum-siz[u]); 31 if (son[u]<son[rt]) rt=u; 32 } 33 inline void getdep(int u,int fa){ 34 if (dis[u]<=k) res=min(res,dep[u]+len[k-dis[u]]); 35 for (int i=h[u];i;i=e[i].nxt){ 36 int v=e[i].to; 37 if (v==fa||vis[v]) continue; 38 dis[v]=dis[u]+e[i].val; 39 dep[v]=dep[u]+1;getdep(v,u); 40 } 41 } 42 inline void upd(int u,int fa){ 43 if (dis[u]<=k) len[dis[u]]=min(len[dis[u]],dep[u]); 44 for (int i=h[u];i;i=e[i].nxt){ 45 int v=e[i].to; 46 if (v==fa||vis[v]) continue;upd(v,u); 47 } 48 } 49 inline void del(int u,int fa){ 50 if (dis[u]<=k) len[dis[u]]=inf; 51 for (int i=h[u];i;i=e[i].nxt){ 52 int v=e[i].to; 53 if (v==fa||vis[v]) continue;del(v,u); 54 } 55 } 56 inline void dfs(int u){ 57 vis[u]=1; 58 for (int i=h[u];i;i=e[i].nxt){ 59 int v=e[i].to; 60 if (vis[v]) continue; 61 dis[v]=e[i].val;dep[v]=1; 62 getdep(v,0);upd(v,u); 63 } 64 for (int i=h[u];i;i=e[i].nxt){ 65 int v=e[i].to; 66 if (vis[v]) continue;del(v,u); 67 } 68 for (int i=h[u];i;i=e[i].nxt){ 69 int v=e[i].to; 70 if (vis[v]) continue; 71 sum=siz[v];rt=0;getrt(v,0);dfs(rt); 72 } 73 } 74 int main() 75 { 76 n=in();k=in();res=inf; 77 memset(len,0x3f,sizeof(len));len[0]=0; 78 for (int i=1;i<n;++i){ 79 x=in()+1;y=in()+1;w=in(); 80 ins(x,y,w);ins(y,x,w); 81 }sum=son[0]=n;rt=0; 82 getrt(1,0);dfs(rt); 83 printf("%d",(res==inf)?-1:res);return 0; 84 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步