Description

Input

Output

Sample Input

10 10
0 1
1 2
2 4
3 12
2 6
2 15
3 5
3 10
7 7
9 16
2 3
1 10 9
2 6
2 5
1 1 8
1 4 13
1 3 11
2 8
2 12
2 14

Sample Output

4
15
6
10
8
11

Data Constraint

Solution

  • 这题的话用两棵 LCT 维护就可以了。

  • 一棵是形态 LCT ,另一棵是权值 LCT (Splay),实际上权值 LCT 是依据形态 LCT 改变的。

  • 每一块中形态和权值 LCT 的点是深度一一对应的。

  • 那么加点的话,就将其父亲 xaccessx\ accessx access (到根路径上的权值已经是单调的了),二分出合适的位置添加即可。

  • 具体来讲就是形态 LCT 中 xxx 后加一个点,权值 LCT 中二分出合适位置加上权值 valvalval。

  • 可以发现这样点与点间仍能一一对应。

  • 那么询问就很好询问了,找到 xxx 在权值 LCT 上对应的值即可(kth)。

  • 时间复杂度 O(nlogn)O(n\ log\ n)O(n log n) 。

Code

#include<cstdio>
#include<cctype>
using namespace std;
const int N=1e6+5;
inline int max(int x,int y)
{return x>y?x:y;
}
struct value
{int mx[N],key[N],s[N][2],fa[N],size[N];inline bool pd(int x){return x==s[fa[x]][1];}inline void update(int x){mx[x]=max(max(mx[s[x][0]],mx[s[x][1]]),key[x]);size[x]=size[s[x][0]]+size[s[x][1]]+1;}inline void rotate(int x){int y=fa[x],w=pd(x);if(fa[x]=fa[y]) s[fa[y]][pd(y)]=x;if(s[y][w]=s[x][w^1]) fa[s[y][w]]=y;s[fa[y]=x][w^1]=y;update(y);}inline void splay(int x){for(int y;y=fa[x];rotate(x))if(fa[y]) rotate(pd(x)==pd(y)?y:x);update(x);}inline int kth(int x,int k){if(size[s[x][0]]+1==k) return x;if(size[s[x][0]]+1>k) return kth(s[x][0],k);return kth(s[x][1],k-size[s[x][0]]-1);}inline int root(int x){while(fa[x]) x=fa[x];return x;}
}v;
struct shape
{int s[N][2],fa[N],size[N],nex[N];inline bool pd(int x){return x==s[fa[x]][1];}inline bool isroot(int x){return s[fa[x]][0]^x && s[fa[x]][1]^x;}inline void update(int x){size[x]=size[s[x][0]]+size[s[x][1]]+1;}inline void rotate(int x){int y=fa[x],w=pd(x);if((fa[x]=fa[y]) && !isroot(y)) s[fa[y]][pd(y)]=x;if(s[y][w]=s[x][w^1]) fa[s[y][w]]=y;nex[x]=nex[y],nex[y]=0;s[fa[y]=x][w^1]=y;update(y);}inline void splay(int x){for(int y;!isroot(x);rotate(x))if(!isroot(y=fa[x])) rotate(pd(x)==pd(y)?y:x);update(x);}inline void access(int x){for(int y=0;x;x=fa[y=x]){splay(x);int xx=v.root(nex[x]);xx=v.kth(xx,size[s[x][0]]+1);v.splay(nex[x]=xx);if(s[x][1]){nex[s[x][1]]=v.s[xx][1];v.fa[v.s[xx][1]]=0;v.s[xx][1]=s[x][1]=0;}if(y){s[x][1]=y;v.s[xx][1]=v.root(nex[y]);if(v.s[xx][1]) v.fa[v.s[xx][1]]=xx;}v.update(xx);update(x);}}
}s;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{freopen("heap.in","r",stdin);freopen("heap.out","w",stdout);int n=read(),q=read();for(int i=1;i<=n;i++){s.fa[i]=read();v.mx[i]=v.key[i]=read();v.size[i]=s.size[i]=1;s.nex[i]=i;}while(q--){int op=read();if(op==1){int x=read(),y=read();s.splay(x);int xx=s.nex[x];v.splay(xx);xx=v.kth(xx,s.size[s.s[x][0]]+1);s.access(x);v.splay(xx);if(v.key[xx]<y){v.fa[++n]=xx;v.key[n]=y;v.size[n]=1;v.s[xx][1]=n;v.update(xx);s.fa[n]=x;s.size[n]=1;s.s[x][1]=n;while(x) s.size[x]++,x=s.fa[x];continue;}int pos=xx;while(true){if(v.s[pos][0] && v.key[v.s[pos][0]]>y){pos=v.s[pos][0];continue;}if(v.s[pos][0] && v.mx[v.s[v.s[pos][0]][1]]>y){int p1=v.s[v.s[pos][0]][1];while(v.key[p1]<y) p1=v.s[p1][1];pos=p1;continue;}else break;}v.splay(pos);v.fa[++n]=pos;v.key[n]=y;v.size[n]=1;if(v.s[pos][0]){v.fa[v.s[pos][0]]=n;v.s[n][0]=v.s[pos][0];}v.s[pos][0]=n;pos=n;while(pos) v.update(pos),pos=v.fa[pos];v.splay(n);s.fa[n]=x;s.size[n]=1;s.s[x][1]=n;while(x) s.size[x]++,x=s.fa[x];}else{int x=read();s.splay(x);int xx=s.nex[x];v.splay(xx);xx=v.kth(xx,s.size[s.s[x][0]]+1);write(v.key[xx]),putchar('\n');}}return 0;
}

JZOJ 5977. 【清华2019冬令营模拟12.15】堆相关推荐

  1. 【清华2019冬令营模拟12.8】视野

    计算几何弱渣果然就是一点感觉也没有. 题目大意: 题解: 首先考虑不删怎么做? 肯定要把点给离散,那么现在对于每一小段,要求出是哪条线段最近? 按一个顺序扫过去,每一条线段打一个加入和删除的标记. 由 ...

  2. jzoj 5970.【北大2019冬令营模拟12.1】space 莫比乌斯反演

    Description Input Output Sample Input 2 1 2 2 1 1 2 2 1 Sample Output 24 样例解释: Data Constraint 分析: 对 ...

  3. JZOJ[5971]【北大2019冬令营模拟12.1】 party(1s,256MB)

    题目 题目大意 给你一棵树,在树上的某一些节点上面有人,要用最小的步数和,使得这些人靠在一起.所谓靠在一起,即是任意两个人之间的路径上没有空的节点(也就是连在一起). N ≤ 200 N \leq 2 ...

  4. JZOJ 5984. 【北大2019冬令营模拟2019.1.1】仙人掌

    Description Input Output Sample Input 5 10 1 2 2 3 2 4 3 5 1 5 2 4 3 5 4 2 3 1 Sample Output 2060 Da ...

  5. jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)

    题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示 ...

  6. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

  7. JZOJ5498. 【清华集训2017模拟12.10】大佬的难题

    Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...

  8. [JZOJ5498]【清华集训2017模拟12.10】大佬的难题

    Description 给出三个1~n的排列a,b,c 求 ∑1≤i,j≤n[ai<aj][bi<bj][ci<cj] \sum\limits_{1\leq i,j\leq n}[a ...

  9. jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)

    这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...

最新文章

  1. 领域驱动设计之聚合与聚合根实例一
  2. netapp脚本保存日志_Shell脚本实战:日志关键字监控+自动告警
  3. 由Handle转换为控件
  4. mysql无法启动服务,错误1067
  5. 二手机床:中国高端机床装备制造列入战略性产业
  6. InfoPath基础应用教程-1 设计一个简单的表单模板
  7. 《构建之法》第1.2.3章读后感以及《硅谷传奇》观后感
  8. 笔记本电脑上如何创建html,笔记本怎么创建wifi_笔记本电脑怎么创建无线网络-win7之家...
  9. Android报unable to instantiate application怎么解决
  10. 逻辑学入门很简单 笔记 一些逻辑学常见概念
  11. Simulink 电机控制:单电阻采样三相电流重构算法仿真总结
  12. 一文搞懂「微信支付 Api-v3」接口规则所有知识点
  13. 沈定刚,雷柏英,李超 | Cell Press Live:人工智能在医学影像中的应用
  14. DH算法 | 迪菲-赫尔曼Diffie–Hellman 密钥交换及RSA(学习笔记)
  15. Android应用如何隐藏APP桌面图标
  16. usnews美国大学计算机科学排名,最新!2019年USNews美国大学计算机专业排名
  17. C# winform调用html的内容
  18. ORA-28547:connection to server failed,probable Oracle net admin errror
  19. 【JZOJ】4210 我才不是萝莉控呢!
  20. 雅虎统计迁移到量子恒道

热门文章

  1. 最长重复子串(Rabin-Karp算法)
  2. win10下gnuplot的安装
  3. Caffe和MATLAB
  4. 科大星云诗社动态20210214
  5. 机器学习笔试精选题精选(四)
  6. VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)
  7. [转]50个c/c++源代码网站
  8. starUML--面向对象的设计过程
  9. 括号,逻辑与,逻辑或--运算符重载
  10. 高级C语言教程-sscanf()函数使用方式