博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1468 Tree
阅读量:5273 次
发布时间:2019-06-14

本文共 2190 字,大约阅读时间需要 7 分钟。

第一次写树分治、找重心,还是不太理解

hzwer:

考虑经过根的路径,依次处理其子树,维护平衡树.

对于第S棵子树其每个结点x,在平衡树中查询出发点为根,终点在S-1子树中,小于K-dis[x]+1的路径数量num,ans+=num

再用S更新平衡树

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #define rre(i,r,l) for(int i=(r);i>=(l);i--) 14 #define re(i,l,r) for(int i=(l);i<=(r);i++) 15 #define Clear(a,b) memset(a,b,sizeof(a)) 16 #define inout(x) printf("%d",(x)) 17 #define douin(x) scanf("%lf",&x) 18 #define strin(x) scanf("%s",(x)) 19 #define LLin(x) scanf("%lld",&x) 20 #define op operator 21 #define CSC main 22 typedef unsigned long long ULL; 23 typedef const int cint; 24 typedef long long LL; 25 using namespace std; 26 void inin(int &ret) 27 { 28 ret=0;int f=0;char ch=getchar(); 29 while(ch<'0'||ch>'9'){ if(ch=='-')f=1;ch=getchar();} 30 while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar(); 31 ret=f?-ret:ret; 32 } 33 struct treap 34 { 35 int ed,root; 36 int ch[40040][2],w[40040],c[40040],s[40040],r[40040]; 37 void inin(){ed=root=0;} 38 void maintain(int k){ if(k)s[k]=c[k]+s[ch[k][0]]+s[ch[k][1]];} 39 void rotate(int &k,int d){ int p=ch[k][d^1];ch[k][d^1]=ch[p][d];ch[p][d]=k;maintain(k);maintain(p),k=p;} 40 void add(int &k,int x) 41 { 42 if(!k){k=++ed,w[k]=x,c[k]=s[k]=1,r[k]=rand(),ch[k][0]=ch[k][1]=0;return ;} 43 s[k]++; 44 if(w[k]==x){c[k]++;return ;} 45 int d=x>w[k]; 46 add(ch[k][d],x); 47 if(r[ch[k][d]]
x)return query(ch[k][0],x); 54 return s[ch[k][0]]+c[k]+query(ch[k][1],x); 55 } 56 }t; 57 int n,head[40040],next[80080],zhi[80080],w[80080],ans,ed,k,sum,root; 58 void add(int a,int b,int c) 59 { 60 next[++ed]=head[a],head[a]=ed,zhi[ed]=b,w[ed]=c; 61 next[++ed]=head[b],head[b]=ed,zhi[ed]=a,w[ed]=c; 62 } 63 bool bo[40040]; 64 int f[40040],s[40040],temp[40040],dis[40040]; 65 void getroot(int x,int fa) 66 { 67 f[x]=0;s[x]=1; 68 for(int i=head[x];i;i=next[i])if(zhi[i]!=fa&&!bo[zhi[i]]) 69 { 70 getroot(zhi[i],x); 71 s[x]+=s[zhi[i]]; 72 f[x]=max(f[x],s[zhi[i]]); 73 } 74 f[x]=max(f[x],sum-s[x]); 75 if(f[x]

 

转载于:https://www.cnblogs.com/HugeGun/p/5153574.html

你可能感兴趣的文章
二、DBMS_JOB(用于安排和管理作业队列)
查看>>
Unity3d Hololens MR开发入门
查看>>
vue-分页搜索功能
查看>>
Redis源码剖析之主从复制
查看>>
Kafka实战系列--Kafka API使用体验
查看>>
【bzoj2770】YY的Treap 权值线段树
查看>>
[development][dpdk][hugepage] 大页内存的挂载
查看>>
【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
查看>>
PHP学习笔记二十三【This】
查看>>
STM32学习之大纲
查看>>
P2010回文日期
查看>>
Python开发的10个小贴士
查看>>
bzoj:3616: War
查看>>
qrcode length overflow (1632>1056)--qrcode.js使用过程中二维码长度溢出解决办法
查看>>
我踩过的听过的那些坑
查看>>
CSS 制作3D旋转视频
查看>>
JQ全选反选
查看>>
sql语句中in和exists的区别
查看>>
python-处理文件
查看>>
eclipse6.5 自动注册代码
查看>>