【ZJOI2016】大森林
这题理论上可以用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】大森林的更多相关文章
- [ZJOI2016]大森林(LCT)
题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y掌握了一种 ...
- [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 ...
- bzoj 4573: [Zjoi2016]大森林
Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树 都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. ...
- P3348 [ZJOI2016]大森林
\(\color{#0066ff}{ 题目描述 }\) 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点, ...
- 【LuoguP3348】[ZJOI2016]大森林
题目链接 题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y ...
- 洛谷P3348 [ZJOI2016]大森林 [LCT]
传送门 刷了那么久水题之后终于有一题可以来写写博客了. 但是这题太神仙了我还没完全弄懂-- upd:写完博客之后似乎懂了. 思路 首先很容易想到\(O(n^2\log n)\)乘上\(O(\frac{ ...
- BZOJ4573 : [Zjoi2016]大森林
扫描线,从左到右依次处理每棵树. 用set按时间顺序维护影响了这棵树的所有操作,那么一个点的父亲就是它前面第一个操作1. 用Splay维护树的括号序列,那么两点间的距离就是括号数量减去匹配的括号个数. ...
- ●洛谷P3348 [ZJOI2016]大森林
题链: https://www.luogu.org/problemnew/show/P3348 题解: LCT,神题 首先有这么一个结论: 每次的1操作(改变生长点操作),一定只会会对连续的一段区间产 ...
随机推荐
- [洛谷P4900]食堂
题目大意:$n(n\leqslant10^6)$组询问,每组询问给出$l,r(l,r\leqslant10^6)$,求($\{\dfrac ij\}$表示$\dfrac ij$的小数部分): $$\s ...
- 【Codeforces Round #405 ( Div 2)】题解
Bear and Big Brother 签到题,直接模拟就可以了. Bear and Friendship Condition 满足只能是每个朋友圈中每个人和其他人都是朋友,这样的边数的确定的. 然 ...
- [JLOI2014]松鼠的新家 树上差分
差分 一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不 ...
- BZOJ4198 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://www.luogu.org/problemnew/show/P2168 ht ...
- CF17E:Palisection——题解
https://vjudge.net/problem/CodeForces-17E http://codeforces.com/problemset/problem/17/E 题目大意:给一个长度为n ...
- 快速搭建http服务:共享文件--Java的我,不知Python你的好
在 Linux 服务器上或安装了 Python 的机器上, 我们可以在指定的文件目录下,使用 python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web ...
- 解决webstrom 输入法光标不跟随问题
参考博客地址 https://blog.csdn.net/wang414300980/article/details/79537875 原因是jdk版本问题,下载jdk jbsdk8u152b1036 ...
- 仅此一文让你明白ASP.NET MVC 之View的显示
有些人要问题,为什么我要学框架?这里我简单说一下,深入理解一个框架,给你带来最直接的好处: 使用框架时,遇到问题可以快速定位,并知道如何解决: 当框架中有些功能用着不爽时,你可以自由扩展,实现你想要的 ...
- kali wireless driver install
acer-gateway nv47h94c 1.lspci -nn |grep 0280 get pci-id root@silee:/# lspci -nn |grep 028003:00.0 Ne ...
- 使用VS2010编译MongoDB C++驱动详解
最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...