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. Android Studio中Gradle使用详解

    一)基本配置 build配置 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools. ...

  2. ubuntu卸载qq2012

    xianbin@xianbin-ThinkPad-E520:~$ sudo dpkg --purge wine-qq2012-longeneteam [sudo] password for xianb ...

  3. Linux环境高级编程--介绍

    从今天開始.将开启Linux环境高级编程(Advanced Programming Of Linux Enviroment)的学习笔记或者说总结,我将持续和大家分享自己的学习成果.本系列博客依托于li ...

  4. android113 自定义进度条

    MainActivity: package com.itheima.monitor; import android.os.Bundle; import android.app.Activity; im ...

  5. Java基础知识强化之IO流笔记47:IO流练习之 随机获取文本文件中的姓名案例

    1.  随机获取文本文件中的姓名案例     需求:我有一个文本文件中存储了几个名称,请大家写一个程序实现随机获取一个人的名字.     分析:           A:  把文本文件中的数据存储到集 ...

  6. 在某些情况下明明添加了引用,为何VS还报错"XXX"不存在类型或命名空间(是否缺少程序集引用)

    程序主结构:两个程序集DLL,一个OpticalAlarm(主程序),一个OpticalAlarm.Common 问题描述:搭建程序框架时,使用了log4net进行日志处理,在OpticalAlarm ...

  7. MVC Filter自定义异常(拦截)

    // ----------------------------------------------------------------------- // <copyright file=&qu ...

  8. Java_Web学习笔记_过滤器应用案例(解决全站字符乱码)

    解决全站字符乱码(POST和GET中文编码问题) servlet: l  POST:request.setCharacterEncoding(“utf-8”); l  GET: String user ...

  9. nvidia安装与卸载方式

    第1种方法:.最好的方式不是手动安装官方驱动(手动安装官方驱动无法使用gpu,而且无法启用3d,同时无法生效,所以最好采用此种方法),而是使用bumblebee-nvidia安装,不过要先添加x-sw ...

  10. C语言之指针1.1数组

    void main() { ]={,,,,,}; ;i++) { printf("%d\n",*(arr+i)); } } 输出结果时候123456