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. App Store上的开源应用汇总

    以下是互联网上主要的开源iOS应用的列表,在学习的时候,多看看完成的功能代码可以给我们带来很多经验,但是除了Apple官方提供的Sample Code之外,我们很难找到优质的开源项目代码,所以我搜集了 ...

  2. python小括号( )与中括号 [ ]

    在python中小括号()表示的是tuple元组数据类型,元组是一种不可变序列. >>> a = (1,2,3) >>> a (1, 2, 3) >>& ...

  3. 一、numpy入门

    Array import numpy as np # create from python list list_1 = [1, 2, 3, 4] array_1 = np.array(list_1)# ...

  4. js parse_url 引发的

    原文链接:https://www.w3.org/TR/2011/WD-html5-20110525/origin-0.html 这里只是做下记录: 5.3 Origin — HTML5 li, dd ...

  5. Arch Linux 天坑

    https://wiki.archlinux.org/index.php/Samba_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) samba  gui客户端 smb4 ...

  6. vue 封装组件上传img

    var _uploadTemplate = '<div>'+ '<input type="file" name="file" v-on:cha ...

  7. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 287: ordinal not in range(128)

    python的str默认是ascii编码,和unicode编码冲突,就会报这个错误. import sys reload(sys) sys.setdefaultencoding('utf8')

  8. Pandas中loc,iloc与直接切片的区别

    最近使用pandas,一直搞不清楚其中几种切片方法的区别,今天专门看了一下. 0. 把Series的行index或Dataframe的列名直接当做属性来索引. 如: s.index_name df.c ...

  9. uboot顶层mkconfig分析

    GNU make:http://www.gnu.org/software/make/manual/make.html#Rules 为了便于理解把uboot中的Makefile配置部分弄出来便于理解,这 ...

  10. Maven运行报错:-Dmaven.multiModuleProjectDirectory system propery is not set.

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...