这题理论上可以用ETT,但是用LCT建虚点可以解决这个问题。

对于最晚的操作1建立一个虚点,然后把操作0挂上去。

#include<bits/stdc++.h>
const int N=4e5+;
using namespace std;
struct Link_Cut_Tree{
int size[N],w[N],c[N][],fa[N],cnt,rev[N],q[N];
inline void newnode(int x){++cnt;size[cnt]=w[cnt]=x;}
inline bool isroot(int x){return (c[fa[x]][]!=x&&c[fa[x]][]!=x)||!x;}
inline void pushup(int x){size[x]=size[c[x][]]+size[c[x][]]+w[x];}
inline void pushdown(int x){
int l=c[x][],r=c[x][];
if(rev[x]){
rev[l]^=;rev[r]^=;rev[x]^=;
swap(c[x][],c[x][]);
}
}
inline void rotate(int x){
int y=fa[x],z=fa[y],l,r;
if(c[y][]==x)l=;else l=;r=l^;
if(!isroot(y)){if(c[z][]==y)c[z][]=x;else c[z][]=x;}
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
}
inline void splay(int x){
int top=;q[top]=x;
for(int i=x;!isroot(i);i=fa[i])q[++top]=fa[i];
for(int i=top;i;i--)pushdown(q[i]);
while(!isroot(x)){
int y=fa[x],z=fa[y];
if(!isroot(y)){
if((c[y][]==x)^(c[z][]==y))rotate(x);
else rotate(y);
}rotate(x);
}
pushup(x);
}
inline int access(int x){int t=;for(;x;t=x,x=fa[x])splay(x),c[x][]=t,pushup(x);return t;}
inline void cut(int x){access(x),splay(x),fa[c[x][]]=,c[x][]=;pushup(x);}
inline void link(int x,int y){splay(x);fa[x]=y;}
}T;
struct Opt{
int pos,opt,x,y;
Opt(int pos=,int opt=,int x=,int y=):pos(pos),opt(opt),x(x),y(y){}
}a[N];
bool cmp(Opt a,Opt b){return a.pos==b.pos?a.opt<b.opt:a.pos<b.pos;}
int n,m,op[N],ed[N],b[N],tot=,ans[N],vis[N],top;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();int now=;
T.newnode();T.newnode();T.link(,);now=;
b[]=;op[]=;ed[]=n;
for(int i=;i<=m;i++){
int opt=read(),l=read(),r=read();
if(opt==){
++tot;T.newnode();
b[tot]=T.cnt;op[tot]=l;ed[tot]=r;
a[++top]=Opt(,i-m,T.cnt,now);
}
else if(opt==){
int k=read();l=max(op[k],l);r=min(r,ed[k]);
if(l<=r){
T.newnode();T.link(T.cnt,now);
a[++top]=Opt(l,i-m,T.cnt,b[k]);
a[++top]=Opt(r+,i-m,T.cnt,now);
now=T.cnt;
}
}
else{
int k=read();vis[i]=;
a[++top]=Opt(l,i,b[r],b[k]);
}
}
sort(a+,a+top+,cmp);int k=,t=;
for(int i=;i<=n;i++){
for(;a[k].pos==i;k++){
if((t=a[k].opt)>){
int x=a[k].x,y=a[k].y;
T.access(x);T.splay(x);ans[t]+=T.size[x];
int lca=T.access(y);T.splay(y);ans[t]+=T.size[y];
T.access(lca);T.splay(lca);ans[t]-=T.size[lca]*;
}else{T.cut(a[k].x);T.link(a[k].x,a[k].y);}
}
}
for(int i=;i<=m;i++)if(vis[i])printf("%d\n",ans[i]);
}

【ZJOI2016】大森林的更多相关文章

  1. [ZJOI2016]大森林(LCT)

    题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y掌握了一种 ...

  2. [ZJOI2016]大森林

    Description: 小Y家里有一个大森林,里面有n棵树,编号从1到n 0 l r 表示将第 l 棵树到第 r 棵树的生长节点下面长出一个子节点,子节点的标号为上一个 0 号操作叶子标号加 1(例 ...

  3. 【刷题】BZOJ 4573 [Zjoi2016]大森林

    Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力.小 ...

  4. BZOJ4573:[ZJOI2016]大森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4573 https://www.luogu.org/problemnew/show/P3348#sub ...

  5. bzoj 4573: [Zjoi2016]大森林

    Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树 都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. ...

  6. P3348 [ZJOI2016]大森林

    \(\color{#0066ff}{ 题目描述 }\) 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点, ...

  7. 【LuoguP3348】[ZJOI2016]大森林

    题目链接 题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y ...

  8. 洛谷P3348 [ZJOI2016]大森林 [LCT]

    传送门 刷了那么久水题之后终于有一题可以来写写博客了. 但是这题太神仙了我还没完全弄懂-- upd:写完博客之后似乎懂了. 思路 首先很容易想到\(O(n^2\log n)\)乘上\(O(\frac{ ...

  9. BZOJ4573 : [Zjoi2016]大森林

    扫描线,从左到右依次处理每棵树. 用set按时间顺序维护影响了这棵树的所有操作,那么一个点的父亲就是它前面第一个操作1. 用Splay维护树的括号序列,那么两点间的距离就是括号数量减去匹配的括号个数. ...

  10. ●洛谷P3348 [ZJOI2016]大森林

    题链: https://www.luogu.org/problemnew/show/P3348 题解: LCT,神题 首先有这么一个结论: 每次的1操作(改变生长点操作),一定只会会对连续的一段区间产 ...

随机推荐

  1. Andorid API Package ---> android

    包名: android                                                        Added in API level 1  URL:http:// ...

  2. bzoj 1103: [POI2007]大都市meg (dfs序)

    dfs序,加个bit维护前缀和就行了 type arr=record toward,next:longint; end; const maxn=; var edge:..maxn]of arr; bi ...

  3. BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 https://www.luogu.org/problemnew/show/P3346 幽香 ...

  4. BZOJ4105 [Thu Summer Camp 2015]平方运算 【线段树】

    题目链接 BZOJ4105 题解 平方操作orz,虽说应该是线段树,但是不会维护啊QAQ 小瞧一眼题解... 平方成环?环长\(lcm\)小于\(60\)? 果然还是打表找规律题.... 那就很好做了 ...

  5. Django内置auth模块中login_required装饰器用于类视图的优雅方式

    使用多继承 以及类似java中的静态代理模式 原理:OrderView.as_view()根据广度优先,调用的是LoginRequiredMixin中的as_view(cls, *args, **kw ...

  6. ExtJs在页面上window再调用Window的事件处理

    今天在开发Ext的过程中遇到了一个恶心的问题,就是在ext.window页面,点击再次弹出window时,gridpanel中的store数据加载异常,不能正常被加载,会出现缓存,出现该问题,是因为w ...

  7. matlab特殊符号表

    Character Sequence Symbol Character Sequence Symbol Character Sequence Symbol \alpha α \upsilon υ \s ...

  8. Atlantis HDU - 1542 (线段树扫描线)

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

  9. POJ 1753 BFS

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 44450   Accepted: 19085 Descr ...

  10. JVM之字节码执行引擎

    方法调用: 方法调用不同于方法执行,方法调用阶段唯一任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不执行方法内部的具体过程.方法调用有,解析调用,分派调用(有静态分派,动态分派). 方法解析 ...