splay(1区间翻转区间最值与区间修改)
直接上板子,这个要好好体会
操作是最经典的。
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <queue>
- #include <map>
- #include <set>
- using namespace std;
- #define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
- inline void read(int &ans) {
- ans=;char x=getchar();bool f=;
- while(x<''||x>'') {if(x=='-')f=;x=getchar();}
- while(x>=''&&x<='')ans=ans*+x-'',x=getchar();
- f?ans=-ans:;
- }
- const int MAXN=1e5+;
- const int INF=2e9;
- struct splay_tree{
- struct node{
- int val,max,add,size,son[];
- bool rev;//区间是否翻转
- void init(int _val){
- val=max=_val ,size=;
- add=rev=son[]=son[]=;
- }
- }T[MAXN];
- int fa[MAXN],root;
- void pushup(int x){
- T[x].max=T[x].val ,T[x].size=;
- for(int k=;k<;k++)
- if(T[x].son[k]){
- T[x].max=max(T[x].max,T[T[x].son[k]].max);
- T[x].size+=T[T[x].son[k]].size;
- }
- }
- void pushdown(int x){
- if(x==)return;
- if(T[x].add){
- for(int k=;k<;k++)
- if(T[x].son[k]){
- T[T[x].son[k]].val+=T[x].add;
- T[T[x].son[k]].max+=T[x].add;
- T[T[x].son[k]].add+=T[x].add;
- }
- T[x].add=;
- }
- if(T[x].rev){
- for(int k=;k<;k++)
- if(T[x].son[k]) T[T[x].son[k]].rev^=;
- swap(T[x].son[],T[x].son[]);
- T[x].rev=;
- }
- }
- void rotate(int x,int k){
- int y=fa[x] ,z=fa[y];
- T[y].son[!k]=T[x].son[k] ,fa[T[x].son[k]]=y;
- T[x].son[k]=y ,fa[y]=x;
- T[z].son[T[z].son[]==y]=x ,fa[x]=z;
- pushup(y);
- }
- void splay(int x,int goal){
- if(x==goal)return;
- while(fa[x]!=goal){
- int y=fa[x] ,z=fa[y];
- pushdown(z) ,pushdown(y) ,pushdown(x);
- int rx=T[y].son[]==x ,ry=T[z].son[]==y;
- if(z==goal)rotate(x,rx);
- else{
- if(rx==ry)rotate(y,ry);
- else rotate(x,rx);
- rotate(x,ry);
- }
- }
- pushup(x);
- if(goal==)root=x;
- }
- int select(int p){
- int u=root;
- pushdown(u);
- while(p!=T[T[u].son[]].size){
- if(p<T[T[u].son[]].size)u=T[u].son[];
- else{
- p-=T[T[u].son[]].size+;
- u=T[u].son[];
- }
- pushdown(u);
- }
- return u;
- }
- void updata(int L,int R,int val){
- int u=select(L-) ,v=select(R+);
- splay(u,);
- splay(v,u);
- T[T[v].son[]].max+=val;
- T[T[v].son[]].val+=val;
- T[T[v].son[]].add+=val;
- }
- void reverse(int l,int r){
- int u=select(l-) ,v=select(r+);
- splay(u,);
- splay(v,u);
- T[T[v].son[]].rev^=;
- }
- int query(int l,int r){
- int u=select(l-) ,v=select(r+);
- splay(u,);
- splay(v,u);
- return T[T[v].son[]].max;
- }
- int build(int l,int r){
- if(l>r) return ;
- if(l==r) return l;
- int mid=(l+r)>> ,ls, rs;
- ls=T[mid].son[]=build(l,mid-);
- rs=T[mid].son[]=build(mid+,r);
- fa[ls]=fa[rs]=mid;
- pushup(mid);
- return mid;
- }
- void init(int n){
- T[].init(-INF) ,T[].init(-INF) ,T[n+].init(-INF);
- for(int i=;i<=n+;i++)T[i].init();
- root=build(,n+) ,fa[root]=;
- fa[]= ,T[].son[]=root ,T[].size=;
- }
- };
- splay_tree bzoj1251;
- int n,m,a,b,c,d;
- int main() {
- read(n),read(m);
- bzoj1251.init(n);
- for(int i=;i<m;i++){
- read(a),read(b),read(c);
- if(a==)read(d),bzoj1251.updata(b,c,d);
- else if(a==)bzoj1251.reverse(b,c);
- else printf("%d\n",bzoj1251.query(b,c));
- }
- return ;
- }
splay(1区间翻转区间最值与区间修改)的更多相关文章
- bzoj 1251序列终结者 splay 区间翻转,最值,区间更新
序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4594 Solved: 1939[Submit][Status][Discuss] De ...
- 【poj1901-求区间第k大值(带修改)】树状数组套主席树
901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7025 Solved: 2925[Sub ...
- CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)
4655 序列终结者 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 网上有许多题,就是给定一个序列,要 ...
- splay区间翻转
原题P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: ...
- hdu-1890-Robotic Sort splay区间翻转
题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- hdu1890 splay维护区间翻转
这题的建模有点不太一样,是按结点横坐标赋予键值的 同时每次rotate和splay时都要注意下往上往下更新 /* 先建立好splay tree,将结点按num/输入顺序排序,遍历时每次将当前结点提到根 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- bzoj 3223 文艺平衡树 splay 区间翻转
Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 17715 Solved: 7769[Submit][Status][ ...
- BZOJ 3223 Splay区间翻转
思路: 区间翻转的裸题 终于tm理解splay了-- //By SiriusRen #include <cstdio> #include <cstring> #include ...
随机推荐
- 在CSS中,link里 的rel="stylesheet"是什么意思?
rel是relationship的英文缩写,它描述了当前页面与href所指定文档的关系:stylesheet就是样式表的意思:CSS是 Cascading Style Sheet(级联样式表)的缩写 ...
- CCF CSP 201803-2 碰撞的小球
题目链接:http://118.190.20.162/view.page?gpid=T72 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段 ...
- 欢迎来到L T X的博客 & 博客转型公告
这里是L T X,一位来自重庆的学生的个人博客. 由于博主以前是OIer,目前博客里主要是OI相关的内容. 但是现在博主已经退役了,因此博客将会转向...嗯...那种...就是那种...比较奇怪的类型 ...
- 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 ...
- JS高级---遍历DOM树
遍历DOM树 第一个函数: 给我根节点, 我会找到所有的子节点: forDOM(根节点) 获取这个根节点的子节点 var children=根节点的.children 调用第二个函数 第二个 ...
- n皇后问题(dfs-摆放问题)
你的任务是,对于给定的N,求出有多少种合法的放置方法. Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量:如果N=0,表示结束.Output共有若干行,每行一个正整数,表示对应输入行 ...
- centos添加用户并赋予 root管理员权限
centos添加用户并赋予 root管理员权限 用centos时,root用户一般都是超级管理员使用的,一般不轻易给别人,但是有时候同事安装软件时需要root账号,又不得不给,只能重新建一个用户,并 ...
- C++-POJ2955-Brackets[DP]
题意就是,找出最长合法子括号序列 容易想到设f[l][r]为l~r的最长合法子括号序列的长度 然后从短的状态往长的状态枚举,不断更新答案就可以了 //#include<bits/stdc++.h ...
- 洛谷P1147 连续自然数和
https://www.luogu.org/problem/P1147 #include<bits/stdc++.h> using namespace std; int main(){ i ...
- gets(), getline(), cin.getline()
gets(str), getline(cin, s), cin.getline(str, len),这三个函数都是读入一行字符串的函数,下面是这三个函数的区别 1. gets() 函数是 C 语言的函 ...