点分治

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 }

 

posted on 2018-06-12 15:18  whz2002  阅读(130)  评论(0编辑  收藏  举报