Description:

小Y家里有一个大森林,里面有n棵树,编号从1到n

0 l r 表示将第 l 棵树到第 r 棵树的生长节点下面长出一个子节点,子节点的标号为上一个 0 号操作叶子标号加 1(例如,第一个 0 号操作产生的子节点标号为 2), l 到 r 之间的树长出的节点标号都相同。保证 1<=l<=r<=n 。

1 l r x 表示将第 l 棵树到第 r 棵树的生长节点改到标号为 x 的节点。对于 i (l<=i<=r)这棵树,如果标号 x的点不在其中,那么这个操作对该树不产生影响。保证 1<=l<=r<=n , x 不超过当前所有树中节点最大的标号。

2 x u v 询问第 x 棵树中节点 u 到节点 v 点的距离,也就是在第 x 棵树中从节点 u 和节点 v 的最短路上边的数量。保证1<=x<=n,这棵树中节点 u 和节点 v 存在。

Hint:

$ N<=10^5,M<=2*10^5 $

Solution:

一开始想到线段树套LCT,然而标记无法下传
考虑朴素做法,每个节点用LCT维护一片森林,空间显然无法承受
这时我们需要转换思路
因为题目没有强制在线,所以我们可以只维护一颗”树“,然后按顺序处理1、2操作
每次1操作直接把该生长节点的子树”嫁接“到另一个生长节点
为了保证复杂度,我们需要在生长节点处开一个虚点,这样就不需要多点换父亲了
2操作直接用求个LCA就行了

#include<bits/stdc++.h>
using namespace std;
const int mxn=3e5+5;
struct Q {int pos,id,x,y,qr;
}q[mxn];
int n,m,p,s,tot,cnt,sum;
int t[mxn],lp[mxn],rp[mxn],bl[mxn],fa[mxn],ch[mxn][2],ans[mxn],val[mxn];int cmp(Q x,Q y) {return x.pos==y.pos?x.id<y.id:x.pos<y.pos;
}namespace lct {int isnotrt(int x) {return ch[fa[x]][0]==x||ch[fa[x]][1]==x;}void push_up(int x) {t[x]=t[ch[x][0]]+t[ch[x][1]]+val[x];}void rotate(int x) {int y=fa[x],z=fa[y],tp=ch[y][1]==x;if(isnotrt(y)) ch[z][ch[z][1]==y]=x; fa[x]=z;ch[y][tp]=ch[x][tp^1]; fa[ch[x][tp^1]]=y;ch[x][tp^1]=y; fa[y]=x;push_up(y),push_up(x);}void splay(int x) {while(isnotrt(x)) {int y=fa[x],z=fa[y];if(isnotrt(y)) (ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);rotate(x);  }}int access(int x) {int y;for(y=0;x;x=fa[y=x])  splay(x),ch[x][1]=y,push_up(x);return y;   }void link(int x,int y) {splay(x); fa[x]=y;}void cut(int x) {access(x); splay(x);  ch[x][0]=fa[ch[x][0]]=0; push_up(x);}
}
using namespace lct;int main()
{scanf("%d%d",&n,&m); int res,lca,opt,l,r,x,y; p=tot=val[1]=t[1]=lp[1]=bl[1]=1; rp[1]=n; int now=2; link(++p,1);for(int i=1;i<=m;++i) {scanf("%d",&opt);if(opt==0) {scanf("%d%d",&l,&r);bl[++tot]=++p; link(p,now); //每次把新节点直接长在最近更新的生成节点,考虑这样为什么不会错,因为实点之间的虚点不会影响答案lp[tot]=l,rp[tot]=r; val[p]=t[p]=1;}else if(opt==1) {scanf("%d%d%d",&l,&r,&x); l=max(l,lp[x]); r=min(r,rp[x]); if(l>r) continue;//去掉无用的区间link(++p,now);q[++s]=(Q){l,i,p,bl[x],0};q[++s]=(Q){r+1,i,p,now,0};now=p;}else scanf("%d%d%d",&l,&x,&y),q[++s]=(Q){l,i,bl[x],bl[y],++sum};}sort(q+1,q+s+1,cmp); for(int i=1;i<=s;++i) {if(q[i].qr>0) {access(q[i].x); splay(q[i].x); res=t[q[i].x]; //因为这题规定根为1,所以我们不能makertlca=access(q[i].y); splay(q[i].y); res+=t[q[i].y];access(lca); ans[q[i].ss]=res-t[lca]*2; }else cut(q[i].x),link(q[i].x,q[i].y);}for(int i=1;i<=sum;++i) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/list1/p/10421740.html

[ZJOI2016]大森林相关推荐

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

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

  2. bzoj 4573: [Zjoi2016]大森林

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

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

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

  4. [ZJOI2016]大森林(LCT)

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

  5. BZOJ4573 : [Zjoi2016]大森林

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

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

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

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

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

  8. 3825. 逃离大森林

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

  9. CF_329_B----AcWing_3825_逃离大森林(BFS究极模板)

    原题链接:https://www.acwing.com/problem/content/3828/ 你是一个宝可梦饲养员,你正在进行你的冒险之旅. 当前,你的目标是逃离飞鸟森林. 飞鸟森林可以表示为一 ...

最新文章

  1. iOS去除导航栏和tabbar的横线
  2. weblogic.rjvm.PeerGoneException
  3. html for循环正方形,JavaScript for 循环
  4. c语言统计数据,数据统计
  5. Git学习总结(24)——彻底搞懂 Git-Rebase
  6. 《研磨设计模式》builder生成器模式(golang)
  7. ar电力远程巡检可视化系统强化员工现场作业能力
  8. win11开热点连接之后无网络解决方案
  9. 我做的通用象棋连线器,可以连接到游戏大厅
  10. Maven项目快速打包
  11. Office 2007免序列号安装的ISO制作方法
  12. 亿能bms上位机_上位机软件 上位机PC软件 bms电池管理系统测试系统软件
  13. grasps什么意思中文_中文和日文微信名字是什么意思 163个
  14. 编译原理:flex与bison--从0到1完成一个编译器(sample语言)①
  15. 操作系统期末实验:多用户二级文件系统
  16. 分享一款将中文网站源代码直接生成英文网站的工具
  17. 装在笔记本里的私有云环境:网络存储篇(中)
  18. 离线数据系统之MapReduce加强
  19. 2020-05-31
  20. 抖音上一封你的信H5网站源码,可对接支付和106短信

热门文章

  1. java 虚基类_重拾C++之虚函数和虚基类以及抽象类
  2. win7 找不到 计算机策略组,win7打开组策略报错:找不到资源string.Advanced_EnableSSL3Fallback...
  3. 微信小程序服务器域名修改生效时间,微信小程序修改request合法域名不生效及解决方法...
  4. rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)
  5. 计算机网络实验报告校园网,校园网规划与设计实验报告.docx
  6. 使用python构建三层神经网络、softmax函数
  7. (递归7)生成可重集的排列
  8. 《SpringCloud超级入门》使用Eureka编写注册中心服务《九》
  9. action script3.0殿堂之路_【日本乐坛传奇】松任谷由实是谁?新音乐女王的登基之路!...
  10. .deploy 文件 php,关于php:Heroku deploy自动删除服务器文件?