这题理论上可以用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. [ZJOI2010]贪吃的老鼠 网络流

    ---题面--- 题解: 这是一道强题emmmm,做法非常巧妙,,,我也是看了好久大佬题解才看明白一点 首先考虑没有限制的情况,即n个老鼠可以在同一时刻吃同一块奶酪 对各个时间段拆点,连奶酪 ---& ...

  2. BZOJ4942 & UOJ314:[NOI2017]整数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4942 http://uoj.ac/problem/314 https://www.luogu.or ...

  3. 洛谷 P1108 低价购买 解题报告

    P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买&quo ...

  4. 第一次BC

    BestCoder Round #90 1001 Kblack loves flag 太弱只写了这一道水题. 首先这个题面就是,完全不知道它在说什么.开始5mins后我还完全不知道这个题想要表达什么. ...

  5. bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)

    为了1A我居然写了个暴力对拍... 那个式子本质上是求nk个数里选j个数,且j%k==r的方案数. 所以把组合数的递推式写出来f[i][j]=f[i-1][j]+f[i-1][(j-1+k)%k].. ...

  6. TYVJ1423 GF和猫咪的玩具

    Description: GF同学和猫咪得到了一个特别的玩具,这个玩具由n个金属环(编号为1---n),和m条绳索组成,每条绳索连接两个不同的金属环,并且长度相同.GF左手拿起金属环L,猫咪右手(或者 ...

  7. Leetcode 94. 二叉树的中序遍历

    1.问题描述 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2.解法一 ...

  8. linux用户登录指定目录

    一.创建用户和用户组 [root@web4 lianyu]# groupadd lianyu [root@web4 lianyu]# useradd lianyu -g lianyu [root@we ...

  9. Intellij IDEA 使用jrebel运行spring-boot并实现自动编译进行热部署

    在使用jrebel运行spring-boot的时候,会发现一个很棘手的问题,就是项目不能自动编译,不能自动编译就不能实现热部署.(使用jar包方式运行的时候) 那么我们就要解决自动编译的问题,首先: ...

  10. div模拟textarea在ios下不兼容的问题解决

    今天发现一个好东西,赶紧记下来,我在用textarea的时候,想要自适应高度,这样就不会出现滚动条.网上找了很多,都是用div模拟的,但是好扯淡,div模拟的在ios下不能聚焦并且不能输入.真坑... ...