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;
}

转载于:https://www.cnblogs.com/Yuzao/p/8968717.html

bzoj 4573: [Zjoi2016]大森林相关推荐

  1. [BZOJ4573][[Zjoi2016]大森林][LCT建虚点]

    [BZOJ4573][[Zjoi2016]大森林][LCT建虚点] 题意懒得写了.... 思路: 建LCT的时候我们可以引入虚点.对于所有的1操作,新建一个没有权值的虚点,然后对于0操作,可以把新建的 ...

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

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

  3. [ZJOI2016]大森林

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

  4. [ZJOI2016]大森林(LCT)

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

  5. BZOJ4573 : [Zjoi2016]大森林

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

  6. [2019.3.20]BZOJ4573 [Zjoi2016]大森林

    发现一个重要的性质:由于不存在删点的操作,所以之后的加点并不会对之前的询问的答案造成影响. 所以我们可以先处理修改,再处理询问. 考虑从左到右扫描每一颗树,每次将前一棵树通过一些修改变为后一棵树. 发 ...

  7. bzoj 4573 大森林

    bzoj 4573 大森林 由于树上路径是唯一的,查询合法的两个点间路径长度显然与其他加点操作无关,所以可以离线处理,将所有的查询放在加点后. 这样我们可以对每棵树都在上颗树的基础上处理好形态后,处理 ...

  8. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  9. 3825. 逃离大森林

    3825. 逃离大森林 题目链接 #include <bits/stdc++.h> #define x first #define y second using namespace std ...

最新文章

  1. 意大利罗马银行连环抢劫案告破 一名警察涉案
  2. java 头像 微信群_仿微信群头像九宫格控件 LQRNineGridImageView
  3. 【测试工程师面试】面试官热衷询问的N个问题
  4. 【Java操作】IDEA 导入Springboot 项目:
  5. Android安全开发之浅谈密钥硬编码
  6. iOS设置tabBarItem.image图片渲染模式
  7. 研究僵局–第4部分:修复代码
  8. Linux修改hostname的几种方式,及遇到的问题
  9. ubuntu常用软件安装_机器学习_第一部分纯命令版本
  10. 福利 | 国外最牛逼的一套 PPT 作品送给你
  11. 过麦--回忆里面的山东
  12. c+primer 学习笔记 3
  13. java排他_Activiti之排他网关
  14. input框中的文字加下划线
  15. HTML学生个人网站作业设计:电影网站设计——电影购票项目(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  16. conemu 打开wsl 报错
  17. vscode代码提示出来慢
  18. 趣店财报:最会赚钱的趣店亏了
  19. 舆情监控和应急处理方案,如何做好网络舆情监控?
  20. 服务器安装2012R2系统失败,windowsserver2012R2安装.net3.5老是提示失败

热门文章

  1. 卡尔曼滤波(Calman Filter)基本原理
  2. graph-easy 纯文本图绘制工具(表格或流程图)
  3. 2013电赛总结【西电专用】
  4. ORCAD CAPTURE 元件库详解
  5. mysql设置定位慢查询_mysql优化——定位慢查询
  6. 对pca降维后的手写体数字图片数据分类_【AI白身境】深度学习中的数据可视化...
  7. matlab数组存字符串,MATLAB字符串数组存储为CSV格式
  8. 飞桨模型保存_飞桨实战笔记:自编写模型如何在服务器和移动端部署
  9. python跨目录调用_python 跨目录访问文件
  10. win10安装ipython_windows10下安装IPython notebook 用来查看.ipynb文档