「ZJOI2016」大森林

神仙题...

很显然线段树搞不了

考虑离线操作

我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试

显然操作0,1都可以拆成差分的形式,就是加入和删除

因为保证了操作2的合法性,我们不妨先不计合法性把所有点加到树中

显然每个点要连到在这个点之前的离这个点时间上最近那个1操作的点上

然后可以发现移动时1操作相当于很多个点换根

我们可以对每个1操作建一个虚点,然后就可以很方便换根了

那么如何保证查询操作呢?

可以把每个1操作的虚点大小设成0(代表它父亲边的直接长度),并按时间串起来。

这样,一个虚点的虚点儿子的子树的点其实也是它的子树了,查询的时候差dis[u]+dis[v]-dis[lca]*2就可以了

是不是以为这个0操作的区间限制就没有用了?

其实不是,注意到1操作的点可能还没出现...这时候就要把1操作删掉


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
using std::min;
using std::max;
const int N=3e5+10;
template <class T>
void read(T &x)
{x=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
int ans[N],n,m,_n,_m,q,p[N],node,ti[N],tot,L[N],R[N];
struct koito_yuu
{int pos,op,u,v;koito_yuu(){}koito_yuu(int Pos,int Op,int U,int V){pos=Pos,op=Op,u=U,v=V;}bool friend operator <(koito_yuu a,koito_yuu b){return a.pos==b.pos?a.op<b.op:a.pos<b.pos;}
}yuu[N];
#define ls ch[now][0]
#define rs ch[now][1]
#define fa par[now]
int sum[N],ch[N][2],par[N],siz[N];
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void updata(int now){sum[now]=sum[ls]+sum[rs]+siz[now];}
void Rotate(int now)
{int p=fa,typ=identity(now);connect(p,ch[now][typ^1],typ);if(isroot(p)) connect(par[p],now,identity(p));else fa=par[p];connect(now,p,typ^1);updata(p),updata(now);
}
void splay(int now)
{for(;isroot(now);Rotate(now))if(isroot(fa))Rotate(identity(now)^identity(fa)?now:fa);
}
int access(int now)
{int las=0;for(;now;las=now,now=fa) splay(now),rs=las,updata(now);return las;
}
int LCA(int x,int y)
{access(x);return access(y);
}
void link(int x,int y)
{access(x),splay(x);par[x]=y;
}
void cat(int x)
{access(x),splay(x);par[ch[x][0]]=0;ch[x][0]=0;
}
int qry(int x)
{access(x),splay(x);return sum[x];
}
int query(int x,int y)
{int lca=LCA(x,y);return qry(x)+qry(y)-(qry(lca)<<1);
}
int main()
{read(n),read(m);L[1]=1,R[1]=n,node=1,++tot;for(int op,l,r,x,u,v,i=1;i<=m;i++){read(op);if(op==0) ++node,read(L[node]),read(R[node]),p[node]=i;else if(op==1){ti[++tot]=i;link(tot,tot-1);read(l),read(r),read(x);l=max(L[x],l),r=min(R[x],r);if(l>r) continue;yuu[++q]=koito_yuu(l,-1,x,tot);yuu[++q]=koito_yuu(r+1,0,x,tot);}else{read(x),read(u),read(v);yuu[++q]=koito_yuu(x,++_n,u,v);}}_m=tot;for(int i=2;i<=node;i++){int pos=std::upper_bound(ti+1,ti+1+_m,p[i])-ti-1;siz[++tot]=1,sum[tot]=1;link(tot,pos);}std::sort(yuu+1,yuu+1+q);for(int j=1,i=1;i<=n;i++){while(yuu[j].pos==i){int u=yuu[j].u+_m-1,v=yuu[j].v;if(u==_m) u=1;if(yuu[j].op==-1){cat(v);link(v,u);}else if(yuu[j].op==0){cat(v);link(v,v-1);}else ans[yuu[j].op]=query(u,v==1?1:v+_m-1);++j;}}for(int i=1;i<=_n;i++) printf("%d\n",ans[i]);return 0;
}

2019.3.11

转载于:https://www.cnblogs.com/butterflydew/p/10513710.html

「ZJOI2016」大森林 解题报告相关推荐

  1. 「SDOI2014」数数 解题报告

    「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...

  2. tyvj P2018 「Nescafé26」小猫爬山 解题报告

    P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经 ...

  3. 「JLOI2015」战争调度 解题报告

    「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...

  4. 「CH2401」送礼物 解题报告

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  5. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  6. LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告

    LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告 前置知识:闭区间上的连续函数的零点存在性定理: 我们定义这样的函数: 定义域为 [ l , r ] ∩ Z [l,r]\cap ...

  7. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  8. loj2090. 「ZJOI2016」旅行者

    loj2090. 「ZJOI2016」旅行者 链接 loj 思路 \((l,mid)(mid+1,r)\).考虑跨过mid的贡献. 假设选的中间那条线的点为gzy,贡献为\(dis(x,gzy)+di ...

  9. 2090. 「ZJOI2016」旅行者 分治,最短路

    2090. 「ZJOI2016」旅行者 链接 loj 思路 \((l,mid)(mid+1,r)\).考虑跨过mid的贡献. 假设选的中间那条线的点为gzy,贡献为\(dis(x,gzy)+dis(g ...

最新文章

  1. java使用eclipse打jar包_Eclipse对Java项目打Jar包
  2. php workerman demo,workerman-demo
  3. 程序员终身发展规划---应对中国软件发展的大环境要求
  4. go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录
  5. 全国人工智能大赛 AI+4K HDR赛项 冠军团队方案分享
  6. 【Mca架构】java互联网高级架构师
  7. 【C++深度剖析教程25】继承中的构造与析构
  8. python中的LEGB 规则
  9. structs2之多文件上传
  10. 蓝桥杯 标题:纵横火柴旗子
  11. 错误:在keystone中无法找到默认角色user_Kubernetes RBAC角色权限控制
  12. 微信扫码登录网页实现原理
  13. 《破茧成蝶——用户体验设计师的成长之路》一1.2 邂逅用户体验设计
  14. VMware for mac inside error solutions
  15. 《统一沟通-微软-实战》-6-部署-5-边缘服务器-2012-07-12-5
  16. imu 里程计融合_多传感器融合 RLINS概述
  17. mysql数据库初始化不成功_初始化mysql的数据库失败怎么办
  18. FPGA:异步FIFO
  19. 计算机硬件找不到网络适配器,图文学习网络适配器不见了 【操作教程】 的恢复方法_...
  20. UVA(WA) 10815 安迪的第一个字典

热门文章

  1. spring入门案例
  2. Python 技术篇-利用pyqt5库监听剪切板变动,clipboard.dataChanged.connect()剪切板监听
  3. Web 性能测试-内存泄漏测试方法之chrome内存快照
  4. Excel VBA中的等价(Eqv)和蕴含(Imp)
  5. manacher马拉车算法
  6. MATLAB线型和颜色对应说明
  7. 讲讲排序(C++描述 )
  8. 微信从原版到现在所有界面图片_微信突然宣布:现在能改微信号了,所有人都能改...
  9. P1507 NASA的食物计划
  10. 将两个有序链表合并,合并后仍然有序