zoukankan      html  css  js  c++  java
  • 点分治

    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 }
  • 相关阅读:
    Redis 集合(Set)
    北京Uber优步司机奖励政策(1月21日)
    成都Uber优步司机奖励政策(1月21日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月21日)
    全国各城市Uber客服联系方式(电话、邮箱、微博)
    成都Uber优步司机奖励政策(1月20日)
    北京Uber优步司机奖励政策(1月20日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月20日)
    Linq聚合函数使用
    Linq查询案例
  • 原文地址:https://www.cnblogs.com/codingutopia/p/centroid_decomposition.html
Copyright © 2011-2022 走看看