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

 -    - -
GET-SUM
MAX-SUM
INSERT -
DELETE
MAKE-SAME
REVERSE
GET-SUM
MAX-SUM

Sample Output

-

HINT

Solution

#include<cstdio>
#include<iostream>
#define N 500010
#define inf 0x3f3f3f3f
#define mid ((x>>1)+(y>>1)+(x&y&1))
using namespace std;
inline int Rin(){
int x=,c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
return x*f;
}
struct nt{
nt*ch[],*p;
bool rev;int cov;
int size,sum,v,lmx,rmx,mmx;
bool d(){return this==p->ch[];}
void setc(nt*c,int d){
ch[d]=c;
c->p=this;
}
void revIt(){
rev^=;
swap(lmx,rmx);
swap(ch[],ch[]);
}
void covIt(int co){
cov=v=co;
sum=co*size;
co>?lmx=rmx=mmx=sum:
lmx=rmx=mmx=co;
}
void pu(){
size=+ch[]->size+ch[]->size;
sum=v+ch[]->sum+ch[]->sum;
lmx=max(ch[]->lmx,ch[]->sum+v+max(ch[]->lmx,));
rmx=max(ch[]->rmx,ch[]->sum+v+max(ch[]->rmx,));
mmx=max(max(ch[]->mmx,ch[]->mmx),max(ch[]->rmx,)+v+max(ch[]->lmx,));
}
void relax(){
if(rev)
ch[]->revIt(),
ch[]->revIt();
if(cov^inf)
ch[]->covIt(cov),
ch[]->covIt(cov);
rev=;
cov=inf;
}
};
nt*null=new nt();
nt*root=null;
int n,a[N],m;
char sign[];
nt*newnode(nt*p,int v){
nt*o=new nt();
o->size=;
o->v=o->sum=o->lmx=o->rmx=o->mmx=v;
o->ch[]=o->ch[]=null;
o->cov=inf;
o->p=p;
return o;
}
void rot(nt*&o){
nt*p=o->p;
p->relax();
o->relax();
bool d=o->d();
p->p->setc(o,p->d());
p->setc(o->ch[!d],d);
o->setc(p,!d);
p->pu();o->pu();
if(p==root)root=o;
}
void splay(nt*o,nt*p){
while(o->p!=p)
if(o->p->p==p)
rot(o);
else
o->d()^o->p->d()?(rot(o),rot(o)):(rot(o->p),rot(o));
o->pu();
}
nt*build(int x,int y){
if(x>y)return null;
nt*o=newnode(o,a[mid]);
o->setc(build(x,mid-),);
o->setc(build(mid+,y),);
o->pu();
return o;
}
void del(nt*&o){
if(o->ch[]!=null)del(o->ch[]);
if(o->ch[]!=null)del(o->ch[]);
delete o;
}
nt*kth(int k){
for(nt*o=root;;){
o->relax();
if(k<=o->ch[]->size)
o=o->ch[];
else{
k-=o->ch[]->size+;
if(!k)return o;
o=o->ch[];
}
}
}
int main(){
n=Rin(),m=Rin();
for(int i=;i<=n;i++)a[i]=Rin();
root=build(,n+);
root->p=null;
int x,y,z;
while(m--){
scanf("%s",sign);
switch(sign[]){
case'S':
x=Rin(),y=Rin();
for(int i=;i<=y;i++)a[i]=Rin();
splay(kth(x+),null);
splay(kth(x+),root);
root->ch[]->setc(build(,y),);
root->ch[]->pu();
root->pu();
break;
case'L':
x=Rin(),y=Rin();
splay(kth(x),null);
splay(kth(x+y+),root);
del(root->ch[]->ch[]);
root->ch[]->ch[]=null;
root->ch[]->pu();
root->pu();
break;
case'K':
x=Rin(),y=Rin(),z=Rin();
splay(kth(x),null);
splay(kth(x+y+),root);
root->ch[]->ch[]->covIt(z);
root->ch[]->pu();
root->pu();
break;
case'T':
x=Rin(),y=Rin();
splay(kth(x),null);
splay(kth(x+y+),root);
printf("%d\n",root->ch[]->ch[]->sum);
break;
case'V':
x=Rin(),y=Rin();
splay(kth(x),null);
splay(kth(x+y+),root);
root->ch[]->ch[]->revIt();
root->ch[]->pu();
root->pu();
break;
case'X':
splay(kth(),null);
splay(kth(root->size),root);
printf("%d\n",root->ch[]->ch[]->mmx);
break;
default:break;
}
}
return ;
}

[bzoj1500][NOI2005 维修数列] (splay区间操作)的更多相关文章

  1. BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】

    以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...

  2. P2042 [NOI2005]维护数列 && Splay区间操作(四)

    到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...

  3. BZOJ1500: [NOI2005]维修数列[splay ***]

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

  4. bzoj1500: [NOI2005]维修数列 (Splay+变态题)

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 11353  Solved: 3553 [Submit][Status][Discuss] Descrip ...

  5. [bzoj1500][NOI2005]维修数列——splay

    题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...

  6. BZOJ1500 [NOI2005]维修数列(Splay tree)

    [Submit][Status][Discuss] Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 Inp ...

  7. [BZOJ1500][NOI2005]维修数列 解题报告 Splay

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

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

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

  9. 【BZOJ1500】[NOI2005]维修数列 Splay

    [BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...

随机推荐

  1. swift中使用GCDMulticastDelegate

    在开源库XMPPFramework中提供了一个GCDMulticastDelegate类,使用它可以为一个对象添加多个被委托的对象,以前用oc编写的工程引入了这个类,使用起来十分方便.最近由于换了工作 ...

  2. Runtime ----- 带你上道

    在IOS开发和学习过程中,我们经常会接触到一个词: Runtime  .很多开发者对之既熟悉又陌生,基本都是浅尝辄止,达不到灵活使用的水平(话说开发中也确实不经常用..)本文和大家一起研究一下,Run ...

  3. jQuery:has()和jQuery:contains()及jQuery:empty

    jQuery:has()和jQuery:contains()两个方法比较类似.不同点在于: has是判断标签的 contains是判断文本的 1.jQuery:has() <div>< ...

  4. 05_锅炉压力案例_java实现

    最开始是有机顶盒,后来电视里面都带着一个安卓的设备.现在空调.冰箱.洗衣机都跃跃欲试地想把这个东西加上.海尔出了一款智能冰箱,就是在冰箱门上嵌了一个12寸的屏幕.这个屏幕实际上就是一个安卓的平板似的. ...

  5. Linux 系统命令 - pwd - 显示当前所在的位置

    命令详解 重要星级: ★★★★★ 功能说明: pwd命令是 "print working directory" 中每个单词的首字母缩写,其功能是显示当前工作目录的绝对路径.在实际工 ...

  6. bzoj 1774: [Usaco2009 Dec]Toll 过路费【排序+Floyd】

    非常迷的一道题啊 我觉得挺对的版本只得了30 总之就是Floyd·改,开两个数组,一个是d[i][j]就是普通的只有边权的最短路,a[i][j]是题目要求的那种 具体改的地方是把枚举中转点的地方把中转 ...

  7. RandomAccessFile使用场景及总结

    大家在学到Java中IO流的时候学到了各种流,对文件的各种操作.但是唯独可能对RandomAccessFile对象不会去过多的研究,那么这个到底有什么用呢? RandomAccessFile的唯一父类 ...

  8. serlvet HttpServletRequest

    1.http://localhost/az/servlet/TestResponse out.print("getServletPath:"+request.getServletP ...

  9. [USACO09NOV]灯Lights

    题目描述 Bessie and the cows were playing games in the barn, but the power was reset and the lights were ...

  10. C - GCD LCM

    Description The GCD of two positive integers is the largest integer that divides both the integers w ...