博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj3720]Gty的妹子树
阅读量:5105 次
发布时间:2019-06-13

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

这道题还有一种分块的做法:每当发现当前子树中有K个点,就将这K个点合在一起,然后把每个块内的节点权值排序(虽然这个算法并没有保证块的个数,但是由于数(shen)(qi)(hai)(luo),所以不妨设为n/K)。

操作0:对于每一个块暴力查询(构建一颗虚树),然后对根所在块暴力,时间复杂度o(K+n/K)

操作1:暴力修改该权值并排序(可以插入,也可以直接sort

操作2:当添加节点父亲所在块节点个数不到K,直接加入该块,否则单独成块,注意维护节点信息。

1 #include
2 using namespace std; 3 #define siz 300 4 #define N 100005 5 struct ji{ 6 int nex,to; 7 }edge[N<<1]; 8 int E,n,m,x,y,s,p,z,ans,head[2][N],bl[N],f[N],w[N],se[N/3][siz+10]; 9 void add(int x,int y,int p){10 edge[E].nex=head[p][x];11 edge[E].to=y;12 head[p][x]=E++;13 }14 void dfs(int k,int fa){15 f[k]=fa;16 if (se[bl[fa]][0]==siz)add(bl[fa],++s,1);17 bl[k]=s;18 se[s][++se[s][0]]=w[k];19 for(int i=head[0][k];i!=-1;i=edge[i].nex)20 if (edge[i].to!=fa)dfs(edge[i].to,k);21 }22 void dfs2(int k){23 ans+=se[k]+se[k][0]+1-upper_bound(se[k]+1,se[k]+se[k][0]+1,y);24 for(int i=head[1][k];i!=-1;i=edge[i].nex)dfs2(edge[i].to);25 }26 void calc(int k,int fa,int p){27 if (bl[k]!=p){28 dfs2(bl[k]);29 return;30 }31 if (w[k]>y)ans++;32 for(int i=head[0][k];i!=-1;i=edge[i].nex)33 if (edge[i].to!=fa)calc(edge[i].to,k,p);34 }35 int main(){36 scanf("%d",&n);37 memset(head,-1,sizeof(head));38 for(int i=1;i
View Code

 

转载于:https://www.cnblogs.com/PYWBKTDA/p/11249872.html

你可能感兴趣的文章
入手腾龙SP AF90mm MACRO
查看>>
python学习4 常用内置模块
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
ResolveUrl的用法
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
java web 中base64传输的坑
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
Activiti入门 -- 环境搭建和核心API简介
查看>>