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. UVA Live 3713 Astronauts (2-SAT)

    用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案. #include<bits/stdc++.h> using namespace std; ; #de ...

  2. Luogu P5349 幂

    大力数学题,发现自己好久没写多项式水平急速下降,求逆都要写挂233 首先看到关于多项式的等比数列求和,我们容易想到先求出每一项的系数然后最后累加起来即可,即设\(f_i=\sum_{n=0}^{\in ...

  3. HTML5微信播放全屏问题的解决方法

    在ios和安卓手机里的微信下播放视频时,会遇到不少问题,例如需要手动点击,视频才会播放,并且视频会跳出微信框,出现控制条,如果视频不是腾讯视频,播放完毕会出现腾讯视频的广告推送等问题 解决办法:给vi ...

  4. robotframework接口测试实例

    *** Settings *** Library Collections Library RequestsLibrary *** Test Cases *** test Create Session ...

  5. 【page-monitor 前端自动化 中篇】 源码分析

    转载文章:来源(靠谱崔小拽) 上篇中初探了page-monitor的一些功能和在前端自动化测试方面的可行性,本篇主要分析下page-monitor的实现方式和源码. mode-module简介 pag ...

  6. ArcMap所有Command GUID

    The information in this topic is useful if you're trying to programmatically find a built-in command ...

  7. C语言中最常用标准库函数

    标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h> <limits ...

  8. [九省联考2018] IIIDX 线段树+贪心

    题目: 给出 k 和 n 个数,构造一个序列使得 d[i]>=d[i/k] ,并且字典序最大. 分析: 听说,当年省选的时候,这道题挡住了大批的高手,看上去十分简单,实际上那道弯段时间内是转不过 ...

  9. Java测试技巧

    快捷键 修改快捷键 window->preference->general->keys: 查找引用:ctrl+shift+g 覆盖测试:alt+shift+E,T 复制一行:ctrl ...

  10. Flask 系列之 构建 Swagger UI 风格的 WebAPI

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 环境初始化 # 创建项目目录 mkdir helloworl ...