博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「vijos」lxhgww的奇思妙想(长链剖分)
阅读量:6478 次
发布时间:2019-06-23

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

 

长链剖分的板子(又是乱搞优化暴力)

对于每一个点,我们定义它深度最深的子节点为它的重儿子(为什么不叫长儿子……),他们之间的连边为重边

然后长链剖分有几个性质

1.总链长为$O(n)$

2.一个节点的$k$级祖先的子树深度必定大于等于当前节点的子树深度

以上两点稍微yy一下就能发现是对的

然后回到这道题。我们设$len[u]$为这一条长链的长度,对于每一个长链的顶点,我们维护它的1到$len[u]$级儿子以及1到$len[u]$级祖先

同时预处理找祖先的倍增数组,并预处理出1到$n$的每一个数字的二进制最高位即$highbit$

那么对于每一个询问$(u,k)$,我们设$r=highbit(k)$,那么我们用预处理的倍增数组让$u$跳到它的$r$级祖先$v$处

因为$k-r<r$,那么$v$的长链的长度$\geq r>k-r$,那么$v$所在的长链预处理的表一定已经包含了$u$的$k$级祖先

时间复杂度为$O(nlogn+m)$,预处理$O(nlogn)$,每一次回答$O(1)$

1 //minamoto 2 #include
3 #include
4 #include
5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 int read(){ 9 #define num ch-'0'10 char ch;bool flag=0;int res;11 while(!isdigit(ch=getc()))12 (ch=='-')&&(flag=true);13 for(res=num;isdigit(ch=getc());res=res*10+num);14 (flag)&&(res=-res);15 #undef num16 return res;17 }18 char sr[1<<21],z[20];int C=-1,Z;19 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}20 void print(int x){21 if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;22 while(z[++Z]=x%10+48,x/=10);23 while(sr[++C]=z[Z],--Z);sr[++C]='\n';24 }25 const int N=3e5+5;26 int head[N],Next[N<<1],ver[N<<1],tot;27 inline void add(int u,int v){28 ver[++tot]=v,Next[tot]=head[u],head[u]=tot;29 }30 int n,md[N],dep[N],fa[N][21],son[N],top[N],len[N],B[N];31 vector
U[N],D[N];32 void dfs(int u,int f){33 md[u]=dep[u]=dep[f]+1,fa[u][0]=f;34 for(int i=1;i<20;++i)35 if(fa[u][i-1]) fa[u][i]=fa[fa[u][i-1]][i-1];36 else break;37 for(int i=head[u];i;i=Next[i]){38 int v=ver[i];39 if(v!=f){40 dfs(v,u);41 if(md[son[u]]
dep[u]) return 0;if(k==0) return u;67 u=fa[u][B[k]],k^=1<

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9818224.html

你可能感兴趣的文章
Eclipse添加新server时无法选择Tomcat7的问题
查看>>
三分 POJ 2420 A Star not a Tree?
查看>>
修改OBS为仅直播音频
查看>>
OCA读书笔记(3) - 使用DBCA创建Oracle数据库
查看>>
Python基础进阶之路(一)之运算符和输入输出
查看>>
阻塞非阻塞异步同步 io的关系
查看>>
ClickStat业务
查看>>
DMA32映射问题
查看>>
POJ 1269 Intersecting Lines(判断两直线位置关系)
查看>>
spring3.0.7中各个jar包的作用总结
查看>>
Windows 10 /win10 上使用GIT慢的问题,或者命令行反应慢的问题
查看>>
Windows平台分布式架构实践 - 负载均衡
查看>>
iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变...
查看>>
SVN服务器使用(二)
查看>>
反射获取内部类以及调用内部类方法
查看>>
App里面如何正确显示用户头像
查看>>
U-BOOT之一:BootLoader 的概念与功能
查看>>
我的路上
查看>>
Velocity处理多余空白和多余空白行问题
查看>>
DB2与oracle有什么区别
查看>>