浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html

浅谈\(fhq\)_\(treap\):https://www.cnblogs.com/AKMer/p/9981274.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1251

平衡树区间操作模板题。

时间复杂度:\(O(mlogn)\)

空间复杂度:\(O(n)\)

\(splay\)版代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=5e4+5; int n,m; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct Splay {
int tot,root;
bool rev[maxn];
int son[maxn][2];
int val[maxn],mx[maxn];
int fa[maxn],siz[maxn],add[maxn]; void update(int p) {
siz[p]=siz[son[p][0]]+1+siz[son[p][1]];
mx[p]=max(mx[son[p][0]],max(val[p],mx[son[p][1]]));
} void build(int l,int r,int lst) {
if(r<l)return;
if(l==r) {
siz[l]=1;fa[l]=lst;
son[lst][l>lst]=l;
return;
}
int mid=(l+r)>>1;
fa[mid]=lst;son[lst][mid>lst]=mid;
build(l,mid-1,mid);build(mid+1,r,mid);
update(mid);
} void prepare() {
tot=n+2;build(1,tot,0);root=(n+3)>>1;mx[0]=-2e9;
} void make_add_tag(int p,int v) {
val[p]+=v;mx[p]+=v;add[p]+=v;
} void make_rev_tag(int p) {
rev[p]^=1;swap(son[p][0],son[p][1]);
} void push_down(int p) {
if(add[p]) {
if(son[p][0])make_add_tag(son[p][0],add[p]);
if(son[p][1])make_add_tag(son[p][1],add[p]);
add[p]=0;
}
if(rev[p]) {
make_rev_tag(son[p][0]);
make_rev_tag(son[p][1]);
rev[p]=0;
}
} int find(int u,int rk) {
push_down(u);
if(siz[son[u][0]]+1==rk)return u;
if(siz[son[u][0]]>=rk)return find(son[u][0],rk);
return find(son[u][1],rk-siz[son[u][0]]-1);
} int t(int u) {
return son[fa[u]][1]==u;
} void rotate(int u) {
int ret=t(u),f=fa[u],s=son[u][ret^1];
son[f][ret]=s;if(s)fa[s]=f;son[u][ret^1]=f;
fa[u]=fa[f];if(fa[f])son[fa[f]][t(f)]=u;
fa[f]=u;update(f);update(u);
} void splay(int goal,int u) {
int tmp=fa[goal];
while(fa[u]!=tmp) {
if(fa[fa[u]]!=tmp) {
if(t(fa[u])==t(u))rotate(fa[u]);
else rotate(u);
}
rotate(u);
}
if(!tmp)root=u;
} void ADD(int l,int r,int v) {
int u1=find(root,l-1),u2=find(root,r+1);
splay(root,u1);splay(son[root][1],u2);
make_add_tag(son[u2][0],v);
} void rever(int l,int r) {
int u1=find(root,l-1),u2=find(root,r+1);
splay(root,u1);splay(son[root][1],u2);
make_rev_tag(son[u2][0]);
} int find_mx(int l,int r) {
int u1=find(root,l-1),u2=find(root,r+1);
splay(root,u1);splay(son[root][1],u2);
return mx[son[u2][0]];
}
}T; int main() {
n=read(),m=read();
T.prepare();
for(int i=1;i<=m;i++) {
int opt=read(),l=read()+1,r=read()+1;
if(opt==1) {
int v=read();
T.ADD(l,r,v);
}
if(opt==2)T.rever(l,r);
if(opt==3)printf("%d\n",T.find_mx(l,r));
}
return 0;
}

\(fhq\)_\(treap\)版代码如下:

#include <ctime>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii; const int maxn=5e4+5; int n,m; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct fhq_treap {
int tot,root;
bool rev[maxn];
int son[maxn][2];
int mx[maxn],siz[maxn];
int val[maxn],add[maxn],fix[maxn]; void update(int p) {
siz[p]=siz[son[p][0]]+1+siz[son[p][1]];
mx[p]=max(mx[son[p][0]],max(val[p],mx[son[p][1]]));
} void build(int l,int r,int lst) {
if(r<l)return;
if(l==r) {
siz[l]=1;son[lst][l>lst]=l;
fix[l]=rand();return;
}
int mid=(l+r)>>1;
son[lst][mid>lst]=mid;fix[mid]=rand();
build(l,mid-1,mid);build(mid+1,r,mid);
update(mid);
} void prepare() {
tot=n;root=(1+n)>>1;build(1,n,0);mx[0]=-2e9;
} void make_add_tag(int p,int v) {
mx[p]+=v;val[p]+=v;add[p]+=v;
} void make_rev_tag(int p) {
rev[p]^=1;swap(son[p][0],son[p][1]);
} void push_down(int p) {
if(add[p]) {
if(son[p][0])make_add_tag(son[p][0],add[p]);
if(son[p][1])make_add_tag(son[p][1],add[p]);
add[p]=0;
}
if(rev[p]) {
make_rev_tag(son[p][0]);
make_rev_tag(son[p][1]);
rev[p]=0;
}
} pii split(int u,int rk) {
if(!rk)return make_pair(0,u);
if(rk==siz[u])return make_pair(u,0);
push_down(u);
if(siz[son[u][0]]>=rk) {
pii tmp=split(son[u][0],rk);
son[u][0]=tmp.second;update(u);
return make_pair(tmp.first,u);
}
else {
pii tmp=split(son[u][1],rk-siz[son[u][0]]-1);
son[u][1]=tmp.first;update(u);
return make_pair(u,tmp.second);
}
} int merge(int a,int b) {
if(!a||!b)return a+b;
push_down(a);push_down(b);
if(fix[a]>fix[b])return son[a][1]=merge(son[a][1],b),update(a),a;
else return son[b][0]=merge(a,son[b][0]),update(b),b;
} void ADD(int l,int r,int v) {
pii tmp1=split(root,r);
pii tmp2=split(tmp1.first,l-1);
make_add_tag(tmp2.second,v);
root=merge(merge(tmp2.first,tmp2.second),tmp1.second);
} void rever(int l,int r) {
pii tmp1=split(root,r);
pii tmp2=split(tmp1.first,l-1);
make_rev_tag(tmp2.second);
root=merge(merge(tmp2.first,tmp2.second),tmp1.second);
} int find_mx(int l,int r) {
pii tmp1=split(root,r);
pii tmp2=split(tmp1.first,l-1);
int res=mx[tmp2.second];
root=merge(merge(tmp2.first,tmp2.second),tmp1.second);
return res;
}
}T; int main() {
srand(time(0));
n=read(),m=read();
T.prepare();
for(int i=1;i<=m;i++) {
int opt=read(),l=read(),r=read();
if(opt==1) {
int v=read();
T.ADD(l,r,v);
}
if(opt==2)T.rever(l,r);
if(opt==3)printf("%d\n",T.find_mx(l,r));
}
return 0;
}

BZOJ1252:序列终结者的更多相关文章

  1. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  2. [BZOJ1251]序列终结者

    [BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...

  3. 【BZOJ1251】序列终结者 Splay

    一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...

  4. BZOJ 1251: 序列终结者

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3773  Solved: 1579 [Submit][Status][Dis ...

  5. BZOJ 1251 序列终结者(Splay)

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...

  6. 【BZOJ】1251: 序列终结者(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

  7. C++之路进阶——codevs4655(序列终结者)

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

  8. 【BZOJ1251】序列终结者

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  9. bzoj1251 序列终结者(Splay Tree+懒惰标记)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  10. BZOJ_1251_序列终结者

    BZOJ_1251_序列终结者 [问题描述] 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V. 2. 将[L,R]这个区间翻 ...

随机推荐

  1. 从e.getMessage()为null看Java异常机制

    问题:自定义异常触发了,但是自定义的提示信息RuntimeException却没有带过来. throw new RuntimeException("不允许插入报价主项和报价子项同时重复的记录 ...

  2. POI之Excel导入

    1,maven配置 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-oox ...

  3. 初识PHP(二)常用函数

    在此记录一些常用库函数和常用语法以便查阅 一.PHP手册 php手册中文地址 http://php.net/manual/zh 二.一些常用操作 2.1字符串操作 2.1.1 strpos — 查找字 ...

  4. 子网掩码与ip有实际关系吗?

    子网掩码是作为ip地址的标识,还是本身就是ip地址的一部分?例如10.10.10.1/24和10.10.10.1/25是同一个ip地址吗? 作者:知乎用户链接:https://www.zhihu.co ...

  5. python 递归求阶乘

    #用递归函数求 n 阶乘的值 def factorial(i): : else: )# sum=n*(n-)!所以直接调用自身 n=int(input('请输入阶乘数:')) ): print('%d ...

  6. Java的封装性、继承性和多态性

    封装 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 封装的优点: 便于使用者正确.方便的使用系 ...

  7. Docker简单部署Ceph测试集群

    通过docker可以快速部署小规模Ceph集群的流程,可用于开发测试. 以下的安装流程是通过linux shell来执行的;假设你只有一台机器,装了linux(如Ubuntu)系统和docker环境, ...

  8. 配置github的SSH key及GitHub项目上传方式一——使用终端命令行

    GitHub是一个开源的大仓库,我们经常从github上下载项目进行学习和研究,下面是一个完整的步骤——往GitHub上传一个新项目. 一.注册GitHub账号 1.注册GitHub账号,地址:htt ...

  9. Android------个人项目(歆语气象通)

    歆语气象通: 歆语气象伴随你的身边,便捷生活. 包含了以下功能: 1. 天气预报数据覆盖中国城市和地区:2. 提供一周天气预报及最低最高温度,时刻关注天气,轻松计划出行:3. 各种指数详细信息,如太阳 ...

  10. UVALive-2966 King's Quest(强连通+二分图匹配)

    题目大意:有n个男孩和和n个女孩,已只每个男孩喜欢的女孩.一个男孩只能娶一个女孩.一个女孩只能嫁一个男孩并且男孩只娶自己喜欢的女孩,现在已知一种他们的结婚方案,现在要求找出每个男孩可以娶的女孩(娶完之 ...