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或fhq treap裸题,就操作多恶心人
ps:MAX-SUM所所代表的区间不能为空……
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
char ch;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
const int inf=;
char s[];
int n,m,v[maxn],x,y,z;
typedef pair<int,int> PII;
int random(int lim){return rand()%lim+;}
struct treap{
int root,tot,stack[maxn],top,son[maxn][],val[maxn];
int siz[maxn],rev[maxn],cov[maxn],sum[maxn],res[maxn][];
void init(){res[][]=-inf;}
void reverse(int x){if (x) swap(son[x][],son[x][]),swap(res[x][],res[x][]),rev[x]^=;}
void cover(int x,int v){if (x) cov[x]=val[x]=v,sum[x]=siz[x]*v,res[x][]=res[x][]=max(sum[x],),res[x][]=sum[x];}
void pushdown(int x){
if (rev[x]) reverse(son[x][]),reverse(son[x][]),rev[x]=;
if (cov[x]!=inf) cover(son[x][],cov[x]),cover(son[x][],cov[x]),cov[x]=inf;
}
void update(int x){
int ls=son[x][],rs=son[x][];
siz[x]=siz[ls]+siz[rs]+;
sum[x]=sum[ls]+sum[rs]+val[x];
res[x][]=max(,max(res[ls][],sum[ls]+val[x]+res[rs][]));
res[x][]=max(,max(res[rs][],sum[rs]+val[x]+res[ls][]));
res[x][]=max(res[ls][]+val[x]+res[rs][],max(res[ls][],res[rs][]));
}
PII split(int x,int k){
if (!k) return make_pair(,x);
if (siz[x]==k) return make_pair(x,);
PII tmp; pushdown(x);
if (k<=siz[son[x][]]){
tmp=split(son[x][],k),son[x][]=tmp.second,update(x);
return make_pair(tmp.first,x);
}
else{
tmp=split(son[x][],k-siz[son[x][]]-),son[x][]=tmp.first,update(x);
return make_pair(x,tmp.second);
}
}
int merge(int x,int y){
if (!x||!y) return x+y;
pushdown(x),pushdown(y);
if (random(siz[x]+siz[y])<=siz[x]){
son[x][]=merge(son[x][],y),update(x);
return x;
}
else{
son[y][]=merge(x,son[y][]),update(y);
return y;
}
}
int newnode(int v){
int x=top?stack[top--]:++tot;
val[x]=sum[x]=v,siz[x]=,son[x][]=son[x][]=rev[x]=,res[x][]=res[x][]=max(v,),res[x][]=v,cov[x]=inf;
return x;
}
int build(int *v,int l,int r){
if (l>r) return ;
int m=(l+r)>>,x=newnode(v[m]);
son[x][]=build(v,l,m-),son[x][]=build(v,m+,r),update(x);
return x;
}
void insert(int x,int *v,int n){
PII t=split(root,x);
int a=t.first,b=build(v,,n),c=t.second;
root=merge(a,merge(b,c));
}
void erase(int x){
stack[++top]=x;
if (son[x][]) erase(son[x][]);
if (son[x][]) erase(son[x][]);
}
void get(int l,int r,int &a,int &b,int &c){
PII t=split(root,r);
c=t.second,t=split(t.first,l-),a=t.first,b=t.second;
}
void erase(int l,int r){
int a,b,c; get(l,r,a,b,c);
erase(b),root=merge(a,c);
}
void cover(int l,int r,int v){
int a,b,c; get(l,r,a,b,c);
cover(b,v),root=merge(a,merge(b,c));
}
void reverse(int l,int r){
int a,b,c; get(l,r,a,b,c);
reverse(b),root=merge(a,merge(b,c));
}
int query_sum(int l,int r){
int a,b,c; get(l,r,a,b,c);
int ans=sum[b]; root=merge(a,merge(b,c));
return ans;
}
int query_max(){return res[root][];}
}T;
int main(){
srand();
read(n),read(m),T.init();
for (int i=;i<=n;i++) read(v[i]);
T.insert(,v,n);
while (m--){
scanf("%s",s);
if (s[]=='S'){
read(x),read(y);
for (int i=;i<=y;i++) read(v[i]);
T.insert(x,v,y);
}
else if (s[]=='L') read(x),read(y),T.erase(x,x+y-);
else if (s[]=='K') read(x),read(y),read(z),T.cover(x,x+y-,z);
else if (s[]=='V') read(x),read(y),T.reverse(x,x+y-);
else if (s[]=='T') read(x),read(y),printf("%d\n",T.query_sum(x,x+y-));
else printf("%d\n",T.query_max());
}
return ;
}

1500: [NOI2005]维修数列的更多相关文章

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

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

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

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

  3. 【BZOJ】1500: [NOI2005]维修数列

    [算法]splay [题解]数据结构 感谢Occult的模板>_<:HYSBZ 1500 维修数列 #include<cstdio> #include<cctype> ...

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

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

  5. 【BZOJ】1500: [NOI2005]维修数列(splay+变态题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 模板不打熟你确定考场上调试得出来? 首先有非常多的坑点...我遇到的第一个就是,如何pushu ...

  6. BZOJ 1500 [NOI2005]维修数列 FHQ Treap

    终于A了这题...这题还是很好...但是我太菜...重构了三遍qwq FHQ Treap大法好!qwq...~~ Ins:直接拿输入造一棵树,把原来的树split成[1,pos],[pos+1,n], ...

  7. [NOI2005] 维修数列

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 8397  Solved: 2530 Description In ...

  8. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

  9. [BZOJ1500][NOI2005]维修数列---解题报告

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

随机推荐

  1. Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序

                                        Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序   XenApp可发布以下类型的资源向用户提供信息访问,这 ...

  2. Java 加密 MD5

    版权声明:本文为博主原创文章,未经博主允许不得转载. [md5] md5是一种哈希算法,哈希算法是啥? ... 特点是不能解密. [代码] package com.uikoo9.util.encryp ...

  3. Ubuntu11.04上tftp服务的配置

    Ubuntu11.04上tftp服务的配置 2011-06-17 15:01 以前ubuntu版本上的tftp已经配置很多遍了,详情可以参见:www.mcuos.com/thread-646-1-2. ...

  4. android activity启动的4种方式记录及打开其他应用的activity的坑

    Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式. ...

  5. OnePlus One(一加1)刷机Kali Nethunter完整教程

    设备信息: 设备名称:OnePlus One(一加1) OS:ColorOS 1.2 设备型号:A0001 目标: 在OnePlus One(一加1)上将 ColorOS 1.2 刷机为 Kali N ...

  6. Oracle在表上建立自增字段的方法

    本方法为使用SEQUENCE(序列)   例如有表temp_test结构为: create table TEMP_TEST ( id number, nm varchar(10), primary k ...

  7. sql server varchar和nvarchar的区别

    一.前言 在了解varchar 和nvarchar之前咱们先了解一下这些词的字面和常用意思,以方便我们更好的使用: SQL SERVER中生成的语句中,字符串前加N.N 前缀必须是大写字母.是Unic ...

  8. UIImagePickerController显示中文界面

    iOS开发中,我们经常遇到获取拍照.相册中图片的功能,就必然少不了UIImagePickerController,但是我们发现当我们使用它的时候,它的页面是英文的,看着很别扭,国人还是比较喜欢看中文界 ...

  9. Dell Remote Access Controller 添加和配置 DRAC/MC 用户

    iDRAC设置 单击“Configuration”(配置)选项卡并选择“Users”(用户). 单击“Username”(用户名)列下的 [Available](可用)添加新用户,或单击“Userna ...

  10. Codevs 4560 NOIP2015 D2T2 子串

    > 4560 NOIP2015 D2T2 子串 时间限制: 1 s 空间限制: 128000 KB 题目等级:黄金 Gold 题目描述 Description 有两个仅包含小写英文字母的字符串A ...