码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】点分治

时间:2019-08-18 21:26:20      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:its   bit   分治   printf   cli   +=   onclick   ret   scanf   

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=4e4+8;
 5 int n,all,mx,root,cntd=0,cnt=0;
 6 ll ans=0,k;
 7 int h[N],siz[N];
 8 ll q[N],dis[N];
 9 bool vis[N];
10 struct edge{
11     int to,nex,w;
12 }e[N<<2];
13 void add(int u,int v,int w){
14     e[++cnt]=(edge){v,h[u],w};
15     h[u]=cnt;
16 }
17 void getrt(int u,int fa){
18     siz[u]=1;
19     int num=0;
20     for(int i=h[u];i;i=e[i].nex){
21         int v=e[i].to;
22         if(v==fa || vis[v]) continue;
23         getrt(v,u);
24         siz[u]+=siz[v];
25         num=max(num,siz[v]);
26     }
27     num=max(num,all-siz[u]);
28     if(num<mx){
29         mx=num;
30         root=u;
31     }
32 }
33 void getdis(int u,int fa){
34     q[++cntd]=dis[u];
35     for(int i=h[u];i;i=e[i].nex){
36         int v=e[i].to;
37         if(v==fa || vis[v]) continue;
38         dis[v]=dis[u]+e[i].w;
39         getdis(v,u);
40     }
41 }
42 ll calc(int u,int len){
43     cntd=0;
44     dis[u]=len;
45     getdis(u,0);
46     ll sum=0;
47     int l=1,r=cntd;
48     sort(q+1,q+1+cntd);
49     while(l<r){
50         if(q[l]+q[r]<=k) sum+=r-l,++l;
51         else --r;
52     }
53     return sum;
54 }
55 void dfs(int u){
56     ans+=calc(u,0);
57     vis[u]=1;
58     for(int i=h[u];i;i=e[i].nex){
59         int v=e[i].to;
60         if(vis[v]) continue;
61         ans-=calc(v,e[i].w);
62         all=siz[v];
63         mx=0x3f3f3f3f;
64         getrt(v,0);
65         dfs(root);
66     }
67 }
68 int main(){
69     scanf("%d",&n);
70     for(int i=1;i<n;++i){
71         int a,b,c;scanf("%d%d%d",&a,&b,&c);
72         add(a,b,c);
73         add(b,a,c);
74     }
75     scanf("%lld",&k);
76     all=n;
77     mx=0x3f3f3f3f;
78     getrt(1,0);
79     dfs(root);
80     printf("%lld",ans);
81     return 0;
82 }
View Code

 

【模板】点分治

标签:its   bit   分治   printf   cli   +=   onclick   ret   scanf   

原文地址:https://www.cnblogs.com/xiaobuxie/p/11373840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!