Description

Input

输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。
第2行包含N个数字,描述初始时的数列。
以下M行,每行一条命令,格式参见问题描述中的表格。
任何时刻数列中最多含有500 000个数,数列中任何一个数字均在[-1 000, 1 000]内。
插入的数字总数不超过4 000 000个,输入文件大小不超过20MBytes。

Output

对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次打印结果,每个答案(数字)占一行。

Sample Input

9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM
INSERT 8 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM

Sample Output

-1
10
1
10

HINT

/*
都是splay的一下基本操作,只是看得懂,但自己写不出来。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#define N 500010
#define inf 1000000000
using namespace std;
int a[N],id[N],fa[N],c[N][];
int v[N],size[N],sum[N],mx[N],lx[N],rx[N],n,m,rt,sz;
int tag[N],rev[N];
queue<int> q; void pushup(int k){
int l=c[k][],r=c[k][];
mx[k]=max(max(mx[l],mx[r]),rx[l]+lx[r]+v[k]);
lx[k]=max(lx[l],sum[l]+lx[r]+v[k]);
rx[k]=max(rx[r],sum[r]+rx[l]+v[k]);
sum[k]=sum[l]+sum[r]+v[k];
size[k]=size[l]+size[r]+;
} void pushdown(int k){
int l=c[k][],r=c[k][];
if(tag[k]){
tag[k]=rev[k]=;
if(l) tag[l]=,v[l]=v[k],sum[l]=v[k]*size[l];
if(r) tag[r]=,v[r]=v[k],sum[r]=v[k]*size[r];
if(v[k]>){
if(l) mx[l]=lx[l]=rx[l]=sum[l];
if(r) mx[r]=lx[r]=rx[r]=sum[r];
}
else {
if(l) mx[l]=v[l],lx[l]=rx[l]=;
if(r) mx[r]=v[r],lx[r]=rx[r]=;
}
}
if(rev[k]){
rev[l]^=;rev[r]^=;rev[k]^=;
swap(lx[l],rx[l]);swap(lx[r],rx[r]);
swap(c[l][],c[l][]);swap(c[r][],c[r][]);
}
} void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(c[y][]==x) l=;else l=;r=l^;
if(y==k) k=x;
else {
if(c[z][]==y) c[z][]=x;
else c[z][]=x;
}
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
} void splay(int x,int &k){
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if(c[z][]==y^c[y][]==x) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} int find(int k,int rk){
pushdown(k);
if(size[c[k][]]+==rk) return k;
else if(size[c[k][]]>=rk) return find(c[k][],rk);
else find(c[k][],rk-size[c[k][]]-);
} int split(int k,int tot){
int x=find(rt,k),y=find(rt,k+tot+);
splay(x,rt);splay(y,c[x][]);
return c[y][];
} void build(int l,int r,int f){
if(l>r) return;
int mid=l+r>>,last=id[f],now=id[mid];
if(l==r){
sum[now]=mx[now]=a[l];size[now]=;
tag[now]=rev[now]=;
lx[now]=rx[now]=max(,a[l]);
}
else build(l,mid-,mid),build(mid+,r,mid);
v[now]=a[mid];fa[now]=last;c[last][mid>=f]=now;
pushup(now);
} void insert(int k,int tot){
for(int i=;i<=tot;i++){
if(!q.empty()) id[i]=q.front(),q.pop();
else id[i]=++sz;
scanf("%d",&a[i]);
}
build(,tot,);int z=id[(+tot)>>];
int x=find(rt,k+),y=find(rt,k+);
splay(x,rt);splay(y,c[x][]);
c[y][]=z;fa[z]=y;
pushup(y);pushup(x);
} void rec(int k){
if(!k) return;
int l=c[k][],r=c[k][];
rec(l);rec(r);q.push(k);
fa[k]=c[k][]=c[k][]=tag[k]=rev[k]=;
} void del(int k,int tot){
int x=split(k,tot),y=fa[x];
rec(x);c[y][]=;
pushup(y);pushup(fa[y]);
} void modify(int k,int tot,int c){
int x=split(k,tot),y=fa[x];
v[x]=c;tag[x]=;sum[x]=v[x]*size[x];
mx[x]=max(v[x],sum[x]);
lx[x]=rx[x]=max(,sum[x]);
pushup(y);pushup(fa[y]);
} void rever(int k,int tot){
int x=split(k,tot),y=fa[x];
rev[x]^=;
swap(lx[x],rx[x]);
swap(c[x][],c[x][]);
pushup(y);pushup(fa[y]);
} int querysum(int k,int tot){
int x=split(k,tot);
return sum[x];
} int main(){
scanf("%d%d",&n,&m);mx[]=a[]=a[n+]=-inf;
for(int i=;i<=n;i++) scanf("%d",&a[i+]);
for(int i=;i<=n+;i++) id[i]=i;
build(,n+,);
rt=(n+)>>;sz=n+;
char ch[];int k,tot,c;
for(int i=;i<=m;i++){
scanf("%s",ch);
if(ch[]!='M'||ch[]!='X') scanf("%d%d",&k,&tot);
if(ch[]=='I') insert(k,tot);
if(ch[]=='D') del(k,tot);
if(ch[]=='R') rever(k,tot);
if(ch[]=='G') printf("%d\n",querysum(k,tot));
if(ch[]=='M'){
if(ch[]=='X') printf("%d\n",mx[rt]);
else scanf("%d",&c),modify(k,tot,c);
}
}
return ;
}

维修队列(bzoj 1500)的更多相关文章

  1. [BZOJ 1500] [NOI2005] 维修数列

    题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...

  2. [BZOJ 1500] 维护序列

    Link: BZOJ 1500 传送门 Solution: 可能平衡树维护序列的所有操作都在这了吧…… 对序列的维护$fhq treap$和$Splay$都能做 有几个注意点: 1.维护序列时始终记得 ...

  3. bzoj 1500: [NOI2005]维修数列 splay

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 6556  Solved: 1963[Submit][Status ...

  4. [BZOJ 1500]维修数列 [Splay Tree从进阶到住院]

    历尽艰辛终于A掉了这题QwQ 贴COGS评论区几句话=.= 策爷:"splay/块状链表的自虐题.".深刻理解到如果没有M倾向就不要去写这题了.. -Chenyao2333 记得b ...

  5. BZOJ 1500: [NOI2005]维修数列 (splay tree)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 4229  Solved: 1283[Submit][Status ...

  6. BZOJ 1500/Luogu 2042 - 维修数列 - [NOI2005][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1500 题目链接:https://www.luogu.org/problemnew/sho ...

  7. bzoj 1500 维修数列

    splay乱搞. 调了两个多小时...这辈子再也不想写splay了... 维护左边最大连续和右边最大连续,维护两个标记,无脑push_down.push_up就行了. 注意最大连续和至少要包含一个数. ...

  8. BZOJ 1500 维修数列【Splay】

    注意:1,内存限制,所以需要回收删除的点 2,当前节点的左连续区间和最大值=max(左子树的左连续区间和最大值,左子树的总和+当节点的值+max(右子树的左连续区间和最大值,0)):右连续区间和最大值 ...

  9. bzoj 1500 维修序列

    Written with StackEdit. Description 请写一个程序,要求维护一个数列,支持以下 \(6\) 种操作: 请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格 I ...

随机推荐

  1. 生鲜o2o配送应用系统,包括Android源码+SSH带后台管理系统

    前台功能划分    我的 登录            账户+密码 注册            订单管理 查看/删除(显示订单详情)                支付(提交订单)           ...

  2. Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]

    这是因为我把 [/WEB-INF/dispatcher-servlet.xml]的位置换成了[config/springmvc/dispatcher-servlet.xml] 因此idea在原来的位置 ...

  3. PAT (Basic Level) Practise (中文)-1029. 旧键盘(20)

    PAT (Basic Level) Practise (中文)-1029. 旧键盘(20) http://www.patest.cn/contests/pat-b-practise/1029 旧键盘上 ...

  4. 博弈论入门 Bash 、Nim 、Wythoff's Game结论及c++代码实现

    SG函数先不说,给自己总结下三大博弈.和二进制及黄金分割联系密切,数学真奇妙,如果不用考试就更好了. 1.Bash Game:n个物品,最少取1个,最多取m个,先取完者胜. 给对手留下(m+1)的倍数 ...

  5. 【线段树】bzoj3585: mex

    非常精妙的线段树题 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三 ...

  6. 主DNS服务-正向解析

    环境 准备最少两台主机 一台当DNS服务器,一台当客户机 如:192.168.43.7这台主机当DNS服务器,192.168.43.6这台主机当客户机 安装DNS服务 yum install -y b ...

  7. perl 对ENV环境变量的使用

    1.hash 方式访问. %ENV  key为环境变量名,value为环境变量值 2.调用ENV模块 . use Env qw(PATH); print "path is $ENV{path ...

  8. spring,spring mvc,mybatis 常用注解

    文章来源:https://www.cnblogs.com/hello-tl/p/9209063.html  0.在spring,soring mvc, mybistis 中的常用注解有一下 <! ...

  9. STM32开发笔记之——CMSIS DAP

    都说开发stm32都是使用kail iar+jatg/swd的方式,然而arm公司已经开发出了CMSIS DAP的开源下载工具,全称是CoreSight Debug Access Port,网络上有大 ...

  10. chardet使用方法

    简单用法 chardet的使用非常简单,主模块里面只有一个函数detect.detect有一个参数,要求是bytes类型.bytes类型可以通过读取网页内容.open函数的rb模式.带b前缀的字符串. ...