[ZJOI2016]大森林(LCT)
题目描述
小Y家里有一个大森林,里面有n棵树,编号从1到n。一开始这些树都只是树苗,只有一个节点,标号为1。这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力。
小Y掌握了一种魔法,能让第l棵树到第r棵树的生长节点长出一个子节点。同时她还能修改第l棵树到第r棵树的生长节点。她告诉了你她使用魔法的记录,你能不能管理她家的森林,并且回答她的询问呢?
题解
这题太神了,废了我一下午。
看到区间操作,就可以想到差分或者扫描线,我们会发现这题基本没有好的方法去执行批量操作,所以我们要用扫描线。
这道题的操作有,区间生长一个点,区间换父亲。
我们对于每个1操作新建一个虚点,然后把它们串起来,然后把每个0操作长出来的点挂在上一个虚点上,然后一通做完之后的树长这样(白点为虚点,黑点为实点)。
时间从上到下为从早到晚。
对于一个换父亲操作,假如说我们要对最下面的白点对应的换父亲的操作换到右边从上到下第二个黑点上,那么我们可以这样。
可以手玩一下,所有有效节点对应的deep是对的。
然后我们用LCT维护这一过程,求两点
注意判断1操作的作用范围。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 200002
using namespace std;
int tr[N][],fa[N],size[N],w[N],cnt,n,m,tot,top,b[N],L[N],R[N],ji[N],qqq,ans,ans2[N];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline bool isroot(int x){return !x||(tr[fa[x]][]!=x&&tr[fa[x]][]!=x);}
inline bool ge(int x){return tr[fa[x]][]==x;}
inline void pushup(int x){size[x]=size[tr[x][]]+size[tr[x][]]+w[x];}
inline void newnode(int x){++cnt;w[cnt]=size[cnt]=x;}
inline void rotate(int x){
int y=fa[x],o=ge(x);
if(isroot(x))return;
tr[y][o]=tr[x][o^];fa[tr[y][o]]=y;
if(!isroot(y))tr[fa[y]][ge(y)]=x;fa[x]=fa[y];
fa[y]=x;tr[x][o^]=y;
pushup(y);pushup(x);
}
inline void splay(int x){
while(!isroot(x)){
int y=fa[x];
if(isroot(y))rotate(x);
else rotate(ge(y)==ge(x)?y:x),rotate(x);
}
}
inline int access(int x){int y=;for(;x;y=x,x=fa[x])splay(x),tr[x][]=y,pushup(x);return y;}//qiu LCA get
inline void link(int x,int y){access(x);splay(x);fa[x]=y;}
inline void cut(int x){access(x);splay(x);fa[tr[x][]]=;tr[x][]=;pushup(x);}
struct node{
int pos,tag,x,y;
inline bool operator <(const node &b)const{
if(pos!=b.pos)return pos<b.pos;
else return tag<b.tag;
}
}a[N<<];
int main(){
n=rd();m=rd();int opt,l,r,k;
newnode();newnode();link(,);
int now=;b[tot=]=;L[tot]=;R[tot]=n;
for(int i=;i<=m;++i){
opt=rd();
if(!opt){
l=rd();r=rd();newnode();
b[++tot]=cnt;L[tot]=l;R[tot]=r;
a[++top]=node{,i-N,cnt,now};
}
else if(opt==){
l=rd();r=rd();k=rd();l=max(l,L[k]);r=min(r,R[k]);
if(l>r)continue;
newnode();link(cnt,now);
a[++top]=node{l,i-N,cnt,b[k]};a[++top]=node{r+,i-N,cnt,now};
now=cnt;
}
else{
k=rd();l=rd();r=rd();ji[i]=++qqq;
a[++top]=node{k,i,b[l],b[r]};
}
}
sort(a+,a+top+);int p=;
for(int i=;i<=n;++i)
for(;a[p].pos==i;++p)
if(a[p].tag<=){cut(a[p].x);link(a[p].x,a[p].y);}
else{
ans=;
access(a[p].x);splay(a[p].x);ans+=size[a[p].x];
int lca=access(a[p].y);splay(a[p].y);ans+=size[a[p].y];
access(lca);splay(lca);ans-=size[lca]*;
ans2[ji[a[p].tag]]=ans;
}
for(int i=;i<=qqq;++i)printf("%d\n",ans2[i]);
return ;
}
[ZJOI2016]大森林(LCT)的更多相关文章
- 洛谷P3348 [ZJOI2016]大森林 [LCT]
传送门 刷了那么久水题之后终于有一题可以来写写博客了. 但是这题太神仙了我还没完全弄懂-- upd:写完博客之后似乎懂了. 思路 首先很容易想到\(O(n^2\log n)\)乘上\(O(\frac{ ...
- bzoj 4573: [Zjoi2016]大森林 lct splay
http://www.lydsy.com/JudgeOnline/problem.php?id=4573 http://blog.csdn.net/lych_cys/article/details/5 ...
- [ZJOI2016]大森林
Description: 小Y家里有一个大森林,里面有n棵树,编号从1到n 0 l r 表示将第 l 棵树到第 r 棵树的生长节点下面长出一个子节点,子节点的标号为上一个 0 号操作叶子标号加 1(例 ...
- 【刷题】BZOJ 4573 [Zjoi2016]大森林
Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力.小 ...
- BZOJ4573:[ZJOI2016]大森林——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4573 https://www.luogu.org/problemnew/show/P3348#sub ...
- P3348 [ZJOI2016]大森林
\(\color{#0066ff}{ 题目描述 }\) 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点, ...
- bzoj 4573: [Zjoi2016]大森林
Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树 都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. ...
- 【LuoguP3348】[ZJOI2016]大森林
题目链接 题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y ...
- UOJ#195. 【ZJOI2016】大♂森林 LCT
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ195.html 题解 首先询问都可以放到最后处理. 对于操作,我们把它差分一下离线下来. 现在的问题就是从 ...
随机推荐
- Problem 2285 迷宫寻宝
http://acm.fzu.edu.cn/problem.php?pid=2285 Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入 ...
- jmeter内存溢出解决办法
原文:http://blog.51cto.com/xqtesting/2107927 使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在 ...
- css 图片文字垂直居中
先来看张图片 相信很多css新手遇到过这种问题,就是当图片和文本显示在一行的时候,效果很奇葩,文字和图片没法对齐, 这时我们需要做的是: 1,先给块级元素设置 display: inline-bloc ...
- [翻译]在asp.net core2.0 OpenID Connect Handler中丢失了声明(CLaims)?
注:这是一篇翻译,来自这里.这篇文章讲述了在asp.net core2.0中使用openid connect handler的过程中解析不到你想要的claim时,你可以参考这篇文章. Missing ...
- 遍历List过程中删除操作报java.util.ConcurrentModificationException错误
1:遍历List 同时 remove 元素,出现java.util.ConcurrentModificationException错误 @Test public void test3(){ List& ...
- 一次linux问题分析原因的简要记录
1. 这边功能测试 一个linux服务器 4c 16g的内存 发现总是出现异常. dotnet run 起来的一个 程序 总是会被killed 现象为: 2. 一开始怀疑是 打开的文件描述符过多 引起 ...
- Python之路-(Django(csrf,中间件,缓存,信号,Model操作,Form操作))
csrf 中间件 缓存 信号 Model操作 Form操作 csrf: 用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middlewa ...
- k8s HPA自动收缩
HPA自动收缩 autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量 #创建一个replicaset测试 [r ...
- lombok标签之@Data @AllArgsConstructor @@NoArgsConstructor -如何去除get,set方法。@Data注解和如何使用,lombok
在代码中我们可以只加上标签@Data 而不用get,set方法: val : 和 scala 中 val 同名, 可以在运行时确定类型; @NonNull : 注解在参数上, 如果该类参数为 null ...
- environment variable
%ALLUSERSPROFILE% C:\ProgramData %APPDATA% C:\Users\cuthead\AppData\Roaming %COMMONPROGRAMFILES% C:\ ...