bzoj 4573: [Zjoi2016]大森林
Description
小Y家里有一个大森林,里面有n棵树,编号从1到n。一开始这些树都只是树苗,只有一个节点,标号为1。这些树
都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力。小Y掌握了一种魔法,能让第l棵树
到第r棵树的生长节点长出一个子节点。同时她还能修改第l棵树到第r棵树的生长节点。她告诉了你她使用魔法的
记录,你能不能管理她家的森林,并且回答她的询问呢?
Solution
有点神仙,看了题解的做法
首先显然要离线,否则空间都是错的,这样维护一棵树就好了
然后发现都是区间修改,扫描线维护一下节点就好了
但是还有删除节点这样的操作,复杂度保证不了
不如先把树的形态都建出来,对于 \(1\) 到 \(n\) 的公共部分我们一起考虑,不同的部分就直接新建节点
考虑维护添加,删除操作的复杂度
我们每产生一个新的生长节点就新建一个虚点,然后把新长出来的都接上去
如果按加入时间考虑的话,有很多连续的节点都是同一个父亲,所以我们用一个虚点暂时代替它们的父亲
然后对于 \(1\) 到 \(n\) 的不同的树,它们的父亲是不一样的,因为建立了这个虚点,所以只需要把虚点的父亲变一下,就可以达到把所有的点的父亲都改变的效果了
具体的也说不清楚,看代码比较直观.....
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=4e5+10;
int n,m,ch[N][2],fa[N],a[N],w[N];
inline void upd(int x){w[x]=w[ch[x][0]]+w[ch[x][1]]+a[x];}
inline bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
inline void rotate(int x){
int y=fa[x];bool t=ch[y][1]==x;
ch[y][t]=ch[x][!t];fa[ch[y][t]]=y;
ch[x][!t]=y;fa[x]=fa[y];
if(!isrt(y))ch[fa[y]][ch[fa[y]][1]==y]=x;
fa[y]=x;upd(y);upd(x);
}
inline void splay(int x){
while(!isrt(x)){
int y=fa[x],p=fa[y];
if(isrt(y))rotate(x);
else if((ch[p][0]==y)==(ch[y][0]==x))rotate(y),rotate(x);
else rotate(x),rotate(x);
}
}
inline int access(int x){
int y=0;
while(x)splay(x),ch[x][1]=y,upd(x),x=fa[y=x];
return y;
}
inline void link(int x,int y){
access(x);splay(x);fa[x]=y;
}
inline void cut(int x){
access(x);splay(x);fa[ch[x][0]]=0;ch[x][0]=0;upd(x);
}
inline int query(int x,int y){
int ret=0,t;
access(x);splay(x);ret+=w[x];
t=access(y);splay(y);ret+=w[y];
access(t);splay(t);ret-=w[t]<<1;
return ret;
}
int L[N],R[N],id[N],cnt=2,ans[N],top=0;
struct data{
int ty,p,x,y;
inline bool operator <(const data &t)const{
if(p!=t.p)return p<t.p;
return ty<t.ty;
}
}q[N];
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n>>m;
int op,l,r,x,y=2,tp=0,ID=1;
L[1]=1;R[1]=n;id[1]=1;w[1]=a[1]=1;
L[2]=1;R[2]=n;w[2]=a[2]=0;link(2,1);
for(int i=1;i<=m;i++){
gi(op);gi(l);gi(r);
if(op==0){
a[++cnt]=1;w[cnt]=1;L[++ID]=l;R[ID]=r;id[ID]=cnt;
link(cnt,y);
}
else if(op==1){
gi(x);
a[++cnt]=0;w[cnt]=0;l=max(l,L[x]);r=min(r,R[x]);
if(l<=r){
link(cnt,y);
q[++top]=(data){-1,l,cnt,id[x]};
q[++top]=(data){-1,r+1,cnt,y};
y=cnt;
}
}
else gi(x),q[++top]=(data){++tp,l,id[r],id[x]};
}
sort(q+1,q+top+1);
for(int i=1,j=1;i<=n;i++){
while(j<=top && q[j].p==i){
if(q[j].ty==-1)cut(q[j].x),link(q[j].x,q[j].y);
else ans[q[j].ty]=query(q[j].x,q[j].y);
j++;
}
}
for(int i=1;i<=tp;i++)printf("%d\n",ans[i]);
return 0;
}
bzoj 4573: [Zjoi2016]大森林的更多相关文章
- 【刷题】BZOJ 4573 [Zjoi2016]大森林
Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力.小 ...
- bzoj 4573: [Zjoi2016]大森林 lct splay
http://www.lydsy.com/JudgeOnline/problem.php?id=4573 http://blog.csdn.net/lych_cys/article/details/5 ...
- BZOJ4573:[ZJOI2016]大森林——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4573 https://www.luogu.org/problemnew/show/P3348#sub ...
- [ZJOI2016]大森林(LCT)
题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y掌握了一种 ...
- [ZJOI2016]大森林
Description: 小Y家里有一个大森林,里面有n棵树,编号从1到n 0 l r 表示将第 l 棵树到第 r 棵树的生长节点下面长出一个子节点,子节点的标号为上一个 0 号操作叶子标号加 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]大♂森林
bzoj luogu uoj sol \(orz\ \ HJT\ \ dalao\)教会我做这道题. 考虑每两个相邻位置的树的差异. 对于一个1操作(更换生长节点),假设区间是\([l,r]\),那么 ...
随机推荐
- 《javascript 高级程序设计》 笔记2 8~章
chapter 8 BOM(浏览器对象模型) window对象 表示浏览器的一个实例. 直接在window对象上定义的属性可以通过delete操作符删除,而全局变量不可以. 窗口关系及框架 位置操作 ...
- 转载 Adobe DreamweaverCS6安装及破解
一:安装 百度链接:链接:http://pan.baidu.com/s/1dF8hTex 密码:zrew (重点) 1) Adobe DreamweaverCS6中文版下载 2)Adobe Dre ...
- leecode刷题(1)-- 删除排序数组中的重复项
删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的 ...
- bzoj2440完全平方数
题目链接 上来先吐槽题面!!!!!! 你跟我说$1$不是完全平方数昂? 看了半天样例啊. 活生生的半天$……$ 莫比乌斯 反演 函数容斥一下,每次二分就好 反正本宝宝不知道反演是啥. 每次判断应 ...
- MySQL5.7配置(第一次使用)
MySQL5.7配置(第一次使用) 最近因为工作需要学习mysql的增删改查.用的公司的电脑,之前有人已经安装过mysql5.7,等于使用了免安装版,重新开始配置.参考了以下文章 http://blo ...
- C#/ASP.NET对URL中的中文乱码处理
前言:UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节. 不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节. 1.直接在C#后台编码URL参数 引用类库:System. ...
- 190225RabbitMQ
一.简单的RabbitMQ示例 生产者 # Author:Li Dongfei import pika connection = pika.BlockingConnection( pika.Conne ...
- Spring Cloud-服务的注册与发现之服务注册中心(Eureka Server)
Spring cloud是为了什么产生的? 根据官网的这个介绍来看,我们可以知道,Spring cloud是为开发者提供的一个工具,而使用这个工具的产生就是为了帮助开发者快速的开发一套比较通用的分布式 ...
- 【webservice】Two classes have the same XML type name(转)
引言 需要调用另一个系统的提供的webservice接口,但是调用之后总是报错,用SoapUI测试接口却没有问题: 那就应该是代码的问题了,但是同样的代码也调用过其他系统却没有问题,不过最终还是解决了 ...
- java.math.BigDecimal cannot be cast to java.lang.String
从数据库总查询出的count(*) 函数统计的值,类型转换方法: Map<String,Integer> map = new HashMap<String,Integer>() ...