bzoj1251权限题

题目点这里,你懂得

直接上板子,这个要好好体会

操作是最经典的。

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <vector>
  7. #include <cmath>
  8. #include <queue>
  9. #include <map>
  10. #include <set>
  11. using namespace std;
  12. #define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
  13. inline void read(int &ans) {
  14. ans=;char x=getchar();bool f=;
  15. while(x<''||x>'') {if(x=='-')f=;x=getchar();}
  16. while(x>=''&&x<='')ans=ans*+x-'',x=getchar();
  17. f?ans=-ans:;
  18. }
  19. const int MAXN=1e5+;
  20. const int INF=2e9;
  21. struct splay_tree{
  22. struct node{
  23. int val,max,add,size,son[];
  24. bool rev;//区间是否翻转
  25. void init(int _val){
  26. val=max=_val ,size=;
  27. add=rev=son[]=son[]=;
  28. }
  29. }T[MAXN];
  30. int fa[MAXN],root;
  31.  
  32. void pushup(int x){
  33. T[x].max=T[x].val ,T[x].size=;
  34. for(int k=;k<;k++)
  35. if(T[x].son[k]){
  36. T[x].max=max(T[x].max,T[T[x].son[k]].max);
  37. T[x].size+=T[T[x].son[k]].size;
  38. }
  39. }
  40.  
  41. void pushdown(int x){
  42. if(x==)return;
  43. if(T[x].add){
  44. for(int k=;k<;k++)
  45. if(T[x].son[k]){
  46. T[T[x].son[k]].val+=T[x].add;
  47. T[T[x].son[k]].max+=T[x].add;
  48. T[T[x].son[k]].add+=T[x].add;
  49. }
  50. T[x].add=;
  51. }
  52. if(T[x].rev){
  53. for(int k=;k<;k++)
  54. if(T[x].son[k]) T[T[x].son[k]].rev^=;
  55. swap(T[x].son[],T[x].son[]);
  56. T[x].rev=;
  57. }
  58. }
  59.  
  60. void rotate(int x,int k){
  61. int y=fa[x] ,z=fa[y];
  62. T[y].son[!k]=T[x].son[k] ,fa[T[x].son[k]]=y;
  63. T[x].son[k]=y ,fa[y]=x;
  64. T[z].son[T[z].son[]==y]=x ,fa[x]=z;
  65. pushup(y);
  66. }
  67.  
  68. void splay(int x,int goal){
  69. if(x==goal)return;
  70. while(fa[x]!=goal){
  71. int y=fa[x] ,z=fa[y];
  72. pushdown(z) ,pushdown(y) ,pushdown(x);
  73. int rx=T[y].son[]==x ,ry=T[z].son[]==y;
  74. if(z==goal)rotate(x,rx);
  75. else{
  76. if(rx==ry)rotate(y,ry);
  77. else rotate(x,rx);
  78. rotate(x,ry);
  79. }
  80. }
  81. pushup(x);
  82. if(goal==)root=x;
  83. }
  84.  
  85. int select(int p){
  86. int u=root;
  87. pushdown(u);
  88. while(p!=T[T[u].son[]].size){
  89. if(p<T[T[u].son[]].size)u=T[u].son[];
  90. else{
  91. p-=T[T[u].son[]].size+;
  92. u=T[u].son[];
  93. }
  94. pushdown(u);
  95. }
  96. return u;
  97. }
  98.  
  99. void updata(int L,int R,int val){
  100. int u=select(L-) ,v=select(R+);
  101. splay(u,);
  102. splay(v,u);
  103. T[T[v].son[]].max+=val;
  104. T[T[v].son[]].val+=val;
  105. T[T[v].son[]].add+=val;
  106. }
  107.  
  108. void reverse(int l,int r){
  109. int u=select(l-) ,v=select(r+);
  110. splay(u,);
  111. splay(v,u);
  112. T[T[v].son[]].rev^=;
  113. }
  114.  
  115. int query(int l,int r){
  116. int u=select(l-) ,v=select(r+);
  117. splay(u,);
  118. splay(v,u);
  119. return T[T[v].son[]].max;
  120. }
  121.  
  122. int build(int l,int r){
  123. if(l>r) return ;
  124. if(l==r) return l;
  125. int mid=(l+r)>> ,ls, rs;
  126. ls=T[mid].son[]=build(l,mid-);
  127. rs=T[mid].son[]=build(mid+,r);
  128. fa[ls]=fa[rs]=mid;
  129. pushup(mid);
  130. return mid;
  131. }
  132.  
  133. void init(int n){
  134. T[].init(-INF) ,T[].init(-INF) ,T[n+].init(-INF);
  135. for(int i=;i<=n+;i++)T[i].init();
  136. root=build(,n+) ,fa[root]=;
  137. fa[]= ,T[].son[]=root ,T[].size=;
  138. }
  139. };
  140.  
  141. splay_tree bzoj1251;
  142. int n,m,a,b,c,d;
  143. int main() {
  144. read(n),read(m);
  145. bzoj1251.init(n);
  146. for(int i=;i<m;i++){
  147. read(a),read(b),read(c);
  148. if(a==)read(d),bzoj1251.updata(b,c,d);
  149. else if(a==)bzoj1251.reverse(b,c);
  150. else printf("%d\n",bzoj1251.query(b,c));
  151. }
  152. return ;
  153. }

splay(1区间翻转区间最值与区间修改)的更多相关文章

  1. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  2. 【poj1901-求区间第k大值(带修改)】树状数组套主席树

    901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7025  Solved: 2925[Sub ...

  3. CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)

    4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序列,要 ...

  4. splay区间翻转

    原题P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: ...

  5. hdu-1890-Robotic Sort splay区间翻转

    题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...

  6. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  7. hdu1890 splay维护区间翻转

    这题的建模有点不太一样,是按结点横坐标赋予键值的 同时每次rotate和splay时都要注意下往上往下更新 /* 先建立好splay tree,将结点按num/输入顺序排序,遍历时每次将当前结点提到根 ...

  8. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  9. bzoj 3223 文艺平衡树 splay 区间翻转

    Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 17715  Solved: 7769[Submit][Status][ ...

  10. BZOJ 3223 Splay区间翻转

    思路: 区间翻转的裸题 终于tm理解splay了-- //By SiriusRen #include <cstdio> #include <cstring> #include ...

随机推荐

  1. 在CSS中,link里 的rel="stylesheet"是什么意思?

    rel是relationship的英文缩写,它描述了当前页面与href所指定文档的关系:stylesheet就是样式表的意思:CSS是 Cascading Style Sheet(级联样式表)的缩写 ...

  2. CCF CSP 201803-2 碰撞的小球

    题目链接:http://118.190.20.162/view.page?gpid=T72 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段 ...

  3. 欢迎来到L T X的博客 & 博客转型公告

    这里是L T X,一位来自重庆的学生的个人博客. 由于博主以前是OIer,目前博客里主要是OI相关的内容. 但是现在博主已经退役了,因此博客将会转向...嗯...那种...就是那种...比较奇怪的类型 ...

  4. Linux - mysql 异常: ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists

    问题描述 ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists 解决方案 删除:/var/lock/su ...

  5. JS高级---遍历DOM树

    遍历DOM树  第一个函数: 给我根节点, 我会找到所有的子节点: forDOM(根节点)  获取这个根节点的子节点  var children=根节点的.children  调用第二个函数  第二个 ...

  6. n皇后问题(dfs-摆放问题)

    你的任务是,对于给定的N,求出有多少种合法的放置方法. Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量:如果N=0,表示结束.Output共有若干行,每行一个正整数,表示对应输入行 ...

  7. centos添加用户并赋予 root管理员权限

     centos添加用户并赋予 root管理员权限 用centos时,root用户一般都是超级管理员使用的,一般不轻易给别人,但是有时候同事安装软件时需要root账号,又不得不给,只能重新建一个用户,并 ...

  8. C++-POJ2955-Brackets[DP]

    题意就是,找出最长合法子括号序列 容易想到设f[l][r]为l~r的最长合法子括号序列的长度 然后从短的状态往长的状态枚举,不断更新答案就可以了 //#include<bits/stdc++.h ...

  9. 洛谷P1147 连续自然数和

    https://www.luogu.org/problem/P1147 #include<bits/stdc++.h> using namespace std; int main(){ i ...

  10. gets(), getline(), cin.getline()

    gets(str), getline(cin, s), cin.getline(str, len),这三个函数都是读入一行字符串的函数,下面是这三个函数的区别 1. gets() 函数是 C 语言的函 ...