2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)
传送门
平衡树好题。
我仍然是用的fhqtreap,感觉速度还行。
维护也比线段树splay什么的写起来简单。
%%%非旋treap大法好。
代码:
#include<bits/stdc++.h>
#define N 500005
#define inf 0x3f3f3f3f
using namespace std;
queue<int>garbage;
typedef pair<int,int> res;
int n,m,rt=0,cnt=0,a[N],son[N][2],siz[N],rd[N],val[N],ls[N],rs[N],ms[N],sum[N],rev[N],cov[N];
inline int read(){
int ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline void swap(int&a,int&b){a^=b,b^=a,a^=b;}
inline int newnode(int v){
int x;
if(!garbage.empty())x=garbage.front(),garbage.pop();
else x=++cnt;
son[x][0]=son[x][1]=rev[x]=0,cov[x]=inf,siz[x]=1,rd[x]=rand(),val[x]=sum[x]=ms[x]=v,ls[x]=rs[x]=max(v,0);
return x;
}
inline void pushup(int p){
if(!son[p][0]&&!son[p][1]){siz[p]=1,sum[p]=ms[p]=val[p],ls[p]=rs[p]=max(val[p],0);return;}
siz[p]=siz[son[p][0]]+siz[son[p][1]]+1;
sum[p]=sum[son[p][0]]+sum[son[p][1]]+val[p];
if(son[p][0]&&son[p][1]){
ms[p]=max(max(ms[son[p][0]],ms[son[p][1]]),rs[son[p][0]]+val[p]+ls[son[p][1]]);
ls[p]=max(ls[son[p][0]],sum[son[p][0]]+val[p]+ls[son[p][1]]);
rs[p]=max(rs[son[p][1]],sum[son[p][1]]+val[p]+rs[son[p][0]]);
return;
}
if(son[p][0]){
ms[p]=max(ms[son[p][0]],rs[son[p][0]]+val[p]);
ls[p]=max(ls[son[p][0]],sum[son[p][0]]+val[p]);
rs[p]=max(0,val[p]+rs[son[p][0]]);
return;
}
ms[p]=max(ms[son[p][1]],ls[son[p][1]]+val[p]);
rs[p]=max(rs[son[p][1]],sum[son[p][1]]+val[p]);
ls[p]=max(0,val[p]+ls[son[p][1]]);
}
inline void pushrev(int p){swap(son[p][0],son[p][1]),swap(ls[p],rs[p]),rev[p]^=1;}
inline void pushcov(int p,int v){
sum[p]=v*siz[p],val[p]=cov[p]=v;
ls[p]=rs[p]=max(sum[p],0);
ms[p]=max(sum[p],v);
}
inline void pushdown(int p){
if(rev[p]){
if(son[p][0])pushrev(son[p][0]);
if(son[p][1])pushrev(son[p][1]);
rev[p]=0;
}
if(cov[p]!=inf){
if(son[p][0])pushcov(son[p][0],cov[p]);
if(son[p][1])pushcov(son[p][1],cov[p]);
cov[p]=inf;
}
}
inline int build(int dat[],int len){
int p,las=0;
static int stk[N],top;
for(int i=1;i<=len;++i){
p=newnode(dat[i]),las=0;
while(top&&rd[stk[top]]>rd[p])pushup(stk[top]),las=stk[top],stk[top--]=0;
if(top)son[stk[top]][1]=p;
son[p][0]=las,stk[++top]=p;
}
while(top)pushup(stk[top--]);
return stk[1];
}
inline int merge(int a,int b){
if(!a||!b)return a+b;
pushdown(a),pushdown(b);
if(rd[a]<rd[b]){son[a][1]=merge(son[a][1],b),pushup(a);return a;}
son[b][0]=merge(a,son[b][0]),pushup(b);return b;
}
inline res split(int p,int k){
if(!p)return res{0,0};
pushdown(p);
res ans,tmp;
if(siz[son[p][0]]>=k){
tmp=split(son[p][0],k);
ans.first=tmp.first,son[p][0]=tmp.second,pushup(p),ans.second=p;
return ans;
}
tmp=split(son[p][1],k-siz[son[p][0]]-1);
ans.second=tmp.second,son[p][1]=tmp.first,pushup(p),ans.first=p;
return ans;
}
inline void garbages(int p){
if(!p)return;
garbage.push(p),garbages(son[p][0]),garbages(son[p][1]);
}
inline void ins(){
int pos=read(),len=read();
static int dat[N];
for(int i=1;i<=len;++i)dat[i]=read();
int rtt=build(dat,len);
res x=split(rt,pos);
rt=merge(merge(x.first,rtt),x.second);
}
inline void del(){
int pos=read(),len=read();
res x=split(rt,pos-1),y=split(x.second,len);
rt=merge(x.first,y.second);
garbages(y.first);
}
inline void modify(){
int pos=read(),len=read(),v=read();
res x=split(rt,pos-1),y=split(x.second,len);
pushcov(y.first,v);
rt=merge(x.first,merge(y.first,y.second));
}
inline void reverse(){
int pos=read(),len=read();
res x=split(rt,pos-1),y=split(x.second,len);
pushrev(y.first);
rt=merge(x.first,merge(y.first,y.second));
}
inline void query(){
int pos=read(),len=read();
res x=split(rt,pos-1),y=split(x.second,len);
printf("%d\n",sum[y.first]);
rt=merge(x.first,merge(y.first,y.second));
}
int main(){
srand(time(NULL));
n=read(),m=read();
for(int i=1;i<=n;++i)a[i]=read();
rt=build(a,n);
while(m--){
char s[20];
scanf("%s",s);
if(s[0]=='I')ins();
else if(s[0]=='D')del();
else if(s[0]=='M'&&s[2]=='K')modify();
else if(s[0]=='R')reverse();
else if(s[0]=='G')query();
else printf("%d\n",ms[rt]);
}
return 0;
}
2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)的更多相关文章
- BZOJ1500[NOI2005]维修数列——非旋转treap
题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 输入 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初 ...
- bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- [BZOJ1500][NOI2005]维修数列 解题报告 Splay
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- [bzoj1500][NOI2005]维修数列_非旋转Treap
维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- splay模板三合一 luogu2042 [NOI2005]维护数列/bzoj1500 [NOI2005]维修数列 | poj3580 SuperMemo | luogu3391 【模板】文艺平衡树(Splay)
先是维修数列 题解看这里,但是我写的跑得很慢 #include <iostream> #include <cstdio> using namespace std; int n, ...
- BZOJ1500: [NOI2005]维修数列[splay ***]
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 12278 Solved: 3880[Submit][Statu ...
- [bzoj1500][NOI2005]维修数列——splay
题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...
随机推荐
- leetcode258
public class Solution { public int AddDigits(int num) { var str = num.ToString(); ; foreach (var c i ...
- 更新403 Forbidden
用TidHTTP下载一个文件 http://192.168.1.1/files/新建文本文档.txt 报错,但是用浏览器打开正常 HTTP/1.1 403 Forbidden 最后不是程序的问题,把i ...
- MySQLNonTransientConnectionException
将mysql-connector-java和druid升级到最新版本: 将驱动设置为driver-class-name: com.mysql.cj.jdbc.Driver url要加上时区设置:url ...
- JetBrains产品永久破解
吃水不忘挖井人,本博客转自:https://www.cnblogs.com/jyiqing/p/7699649.html 目的: 本人使用idea和webstorm进行开发,无奈正版实在是太贵了,只能 ...
- 批量部署ssh私钥认证
vim batch_sshkey.sh #!/bin/bashcd /rootcat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keysfor ...
- varnish--vcl
●Varnish Configuration Language - VCL(varnish配置语言-VCL) Varnish有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打 ...
- Haskell语言学习笔记(30)MonadCont, Cont, ContT
MonadCont 类型类 class Monad m => MonadCont m where callCC :: ((a -> m b) -> m a) -> m a in ...
- SQL Server:查看数据库用户权限(SQL 2005)
1. 查看 SQL 2005 用户所属数据库角色 use yourdb go select DbRole = g.name, MemberName = u.name, MemberSID = u.si ...
- MySQL Installation of system tables failed!
刚开始学习Linux,就遇到了问题. 当在RedHat下安装MySQL时提示如下错误,请高手给点指点,谢谢: rpm -vih MySQL-server-community-5.0.96-1.rhe ...
- ora-01652无法通过128(在temp表空间中)扩展temp段
有两种错误:1.数据表空间不足 2.临时表空间不足 有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程: 既然是temp表空间有问题,那当然就要从temp表空间说起啦.首先要说明的 ...