bzoj1251权限题

题目点这里,你懂得

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

操作是最经典的。

 #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区间翻转区间最值与区间修改)的更多相关文章

  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. Java并发,synchronized锁住的内容

    synchronized用在方法上锁住的是什么? 锁住的是当前对象的当前方法,会使得其他线程访问该对象的synchronized方法或者代码块阻塞,但并不会阻塞非synchronized方法. 脏读 ...

  2. 2.Ubuntu安装 Docker

    平台支持 Docker CE 支持多种平台,如下表所示 桌面 平台 架构 Docker Desktop for Mac (macOS) X64 Docker Desktop for Windows ( ...

  3. Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type

    问题描述 将项目挂载到 Myeclipse 的 tomcat 上,启动 tomcat ,报错“Initialization of bean failed; nested exception is ja ...

  4. npm 模块开发调试技巧之最优方案npm link

    在我们平时写项目中,当我们需要新开发或修改的 npm 模块时,如何在本地项目中调试呢? 本地项目路径:G:\npm\project 开发的模块路径:G:\npm\model 方法一: 在cmd命令窗口 ...

  5. AngularJS中transclude用法详解

    这篇文章主要介绍了AngularJS中transclude用法,详细分析了transclude的具体功能.使用技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了AngularJS中transcl ...

  6. ASP.NET MVC 用户权限-1

    MVC框架的开发网站的利器,MVC框架也开始越来越流行了.对于.NET ,微软也发布了MVC框架,做网站通常要涉及到用户的权限管理,对于.NET MVC 框架的用户权限管理又应该怎样设置呢?下面通过示 ...

  7. mysql对表中数据根据某一字段去重

    要删除重复的记录,就要先查出重复的记录,这个很容易做到 注意:这是查出所有重复记录的第一条记录,需要保留,因此需要添加查询条件,查出所有的重复记录 ) ) 然后 delete from cqssc w ...

  8. 巨杉Tech | SequoiaDB虚机镜像正式上线

    数据库云化架构需求 随着云架构的发展和流行,在业务和应用进行“云化”的过程中,云数据库因为在整体架构中的重要地位,在云化改造中的重要性不言而喻.云数据库需要满足这些技术要求,除了在功能上的具体提升,在 ...

  9. windows下划分逻辑分区

    运行命令窗口后,我们输入命令"diskpart"回车! 然后我们在DISKPART>后面输入select disk 0 选择我们的硬盘,然后回车!当然如果你电脑上有好几块硬盘 ...

  10. HTML备忘

    a标签事件 a:link {color: #000000} /* 未访问的链接 */ a:visited {color: #d90a81} /* 已访问的链接 */ a:hover {color: # ...