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

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=100000+10,inf=-1u>>1;
    11 struct tedge{int x,y,w,next;}adj[maxn<<1];int fch[maxn],ms=0;
    12 void addedge(int u,int v,int w){
    13     adj[++ms]=(tedge){u,v,w,fch[u]};fch[u]=ms;
    14     adj[++ms]=(tedge){v,u,w,fch[v]};fch[v]=ms;
    15     return;
    16 }
    17 int deep[maxn],d[maxn],f[maxn],son[maxn],n,K,cnt,sum,ans,root;bool vis[maxn];
    18 void getroot(int x,int fa){
    19     son[x]=1;f[x]=0;
    20     for(int i=fch[x];i;i=adj[i].next){
    21         int v=adj[i].y;
    22         if(v==fa||vis[v])continue;
    23         getroot(v,x);
    24         son[x]+=son[v];
    25         f[x]=max(f[x],son[v]);
    26     }
    27     f[x]=max(f[x],sum-son[x]);
    28     if(f[x]<f[root])root=x;return;
    29 }
    30 void getdeep(int x,int fa){
    31     deep[++deep[0]]=d[x];
    32     for(int i=fch[x];i;i=adj[i].next){
    33         int v=adj[i].y;
    34         if(v==fa||vis[v])continue;
    35         d[v]=d[x]+adj[i].w;
    36         getdeep(v,x);
    37     } return;
    38 }
    39 int cal(int x,int now){
    40     d[x]=now;deep[0]=0;getdeep(x,0);
    41     sort(deep+1,deep+deep[0]+1);
    42     int t=0,l,r;
    43     for(l=1,r=deep[0];l<r;){
    44         if(deep[l]+deep[r]<=K){t+=r-l;l++;}
    45         else r--;
    46     } return t;
    47 }
    48 void work(int x){
    49     ans+=cal(x,0);vis[x]=1;
    50     for(int i=fch[x];i;i=adj[i].next){
    51         int v=adj[i].y;
    52         if(vis[v])continue;
    53         ans-=cal(v,adj[i].w);
    54         sum=son[v];
    55         root=0;
    56         getroot(v,root);
    57         work(root);
    58     } return;
    59 }
    60 inline int read(){
    61     int x=0,sig=1;char ch=getchar();
    62     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    63     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    64     return x*=sig;
    65 }
    66 inline void write(int x){
    67     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    68     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    69     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    70 }
    71 int main(){
    72     while(1){
    73         ans=0;root=0;cnt=0;
    74         memset(vis,0,sizeof(vis));
    75         memset(fch,0,sizeof(fch));
    76         n=read();K=read();
    77         if(n==0)break;
    78         for(int i=1;i<n;i++){
    79             int u=read(),v=read(),w=read();
    80             addedge(u,v,w);
    81         }
    82         sum=n;f[0]=inf;
    83          getroot(1,0);
    84         work(root);
    85         write(ans);ENT;
    86     } return 0;
    87 }
  • 相关阅读:
    codevs 4511 信息传递(NOIP2015 day1 T2)
    caption标签,为表格添加标题和摘要
    用css样式,为表格加入边框
    table标签,认识网页上的表格
    认识div在排版中的作用
    使用ol,添加图书销售排行榜
    使用ul添加列表
    使用<pre>标签为你的网页加入大段代码
    想加入一行代码吗?使用<code>标签
    <address>标签,为网页加入地址信息
  • 原文地址:https://www.cnblogs.com/chxer/p/4591951.html
Copyright © 2011-2022 走看看