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. 关机相关(shutdown,reboot)

    慣用的關機指令: shutdown 由於Linux的關機是那麼重要的工作,因此除了你是在主機前面以tty7圖形介面來登入系統時, 不論用什麼身份都能夠關機之外,若你是使用遠端管理工具(如透過piett ...

  2. Windows 自己主动关机命令 shuntdown

    以下介绍一个在Windows XP下实现定时关机的简单方法. 一 .倒计时关机:      指定系统在10分钟后自己主动关闭:点击“開始→执行”,输入命令“Shutdown -s -t 60”(注意: ...

  3. Socket异步通信学习一

    最近在做一个频谱管理项目,负责通信模块,自己也是小白,重头学起,直至今天通信基本框架已经完成,把自己在学习中的心得与大家分享一下,做一个socket系列的博文,顺便加固一下自己对socket通信的认识 ...

  4. IEnumerable 和 IQueryable

    共有两组 LINQ 标准查询运算符,一组在类型为 IEnumerable<T> 的对象上运行,另一组在类型为 IQueryable<T> 的对象上运行.构成每组运算符的方法分别 ...

  5. YII中面包屑制作(当前位置:网站首页 >> 会员登陆)

    面包屑制作(当前位置:网站首页 >> 会员登陆) 作用:就是在布局里要显示的信息,但这个信息在不同的页面里显示的内容不一样,例如:网页的title.网页的当前位置等等 1.布局中每个页面t ...

  6. js读取Excel文件数据-IE浏览器

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  7. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

  8. 访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析

    首先,我们需要清楚一下方法是由哪些部分构成的: [权限修饰符列表][别的修饰符列表] 返回值类型 方法名(参数列表){   方法体:} 然后我们需要知道成员变量和成员方法访问有几种情况:1.当前包同一 ...

  9. IOS_OC_本地推送知识总结

    知识点介绍 一. 推送通知介绍(了解) 二. 本地推送通知 本地通知的基本使用 本地通知的不常用属性 删除重复的通知 通知的处理1-跳转界面 通知的处理2-程序退出 分类的设置/快捷回复 一. 推送通 ...

  10. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构: