[bzoj1500][NOI2005 维修数列] (splay区间操作)
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区间操作)的更多相关文章
- BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】
以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...
- P2042 [NOI2005]维护数列 && Splay区间操作(四)
到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...
- BZOJ1500: [NOI2005]维修数列[splay ***]
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 12278 Solved: 3880[Submit][Statu ...
- bzoj1500: [NOI2005]维修数列 (Splay+变态题)
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 11353 Solved: 3553 [Submit][Status][Discuss] Descrip ...
- [bzoj1500][NOI2005]维修数列——splay
题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...
- BZOJ1500 [NOI2005]维修数列(Splay tree)
[Submit][Status][Discuss] Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 Inp ...
- [BZOJ1500][NOI2005]维修数列 解题报告 Splay
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- 【BZOJ1500】[NOI2005]维修数列 Splay
[BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...
随机推荐
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- KMP POJ 1961 Period
题目传送门 /* 题意:求一个串重复出现(>1)的位置 KMP:这简直和POJ_2406没啥区别 */ /******************************************** ...
- 使用mysqldump导出数据库(表)
mysqldump用来备份数据库或在不同数据库之间迁移数据,mydqldump的备份内容包括用来创建表和装载表的SQL语句. 一.mysqldump使用方法 (1).备份单个数据库或数据库中的部分表, ...
- 282 Expression Add Operators 给表达式添加运算符
给定一个仅包含0-9的字符串和一个目标值,返回在数字之间添加了二元运算符(不是一元的) +.-或*之后所有能得到目标值的情况.例如:"123", 6 -> ["1+ ...
- kafka的topic命名技巧
不多说,直接上干货! 比如,我们给kafka的topic命名为user_r2p10 表示user这个topic的副本因子(r)是2,分区数(p)是10. 这样后期在写消费者代码的时候,根据top ...
- Objective-C设计模式——适配器Adapter(接口适配)
适配器模式 适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口.此时我们需要自己来实现适配,在适配器模式中有Target对象,即客户端所需要的接口对象,Adaptee对象,即 ...
- Redis作者:深度剖析Redis持久化
Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...
- CSS知识点整理(1):CSS语法,层叠次序,选择器,其他重要方面。
1. css的全称 2. CSS的层叠次序:优先级由低到高 ·浏览器设置 ·外部样式表 或者 内部样式表 —— 就近原则 ·内联样式 3. CSS的3种形式,以及每种形式的语法格式 ——注意样式表的为 ...
- ionic3带参数返回原来页面
最近用ionic3+angular4做项目.我遇到了个问题,我返回原来页面时一般都会调用this.navCtrl.pop()方法,但这个方法不能携带参数.怎么办? 可以写个回调方法. 我在a页面定义个 ...
- 推荐一些相见恨晚的 Python 库 「一」
扯淡 首先说明下,这篇文章篇幅过长并且大部分是链接,因此非常适合在电脑端打开访问. 本文内容摘自 Github 上有名的 Awesome Python.这是由 vinta 在 14 年发起并持续维护的 ...