1500: [NOI2005]维修数列
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
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
10
1
10
HINT
#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]维修数列的更多相关文章
- bzoj 1500: [NOI2005]维修数列 splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 6556 Solved: 1963[Submit][Status ...
- BZOJ 1500: [NOI2005]维修数列 (splay tree)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 4229 Solved: 1283[Submit][Status ...
- 【BZOJ】1500: [NOI2005]维修数列
[算法]splay [题解]数据结构 感谢Occult的模板>_<:HYSBZ 1500 维修数列 #include<cstdio> #include<cctype> ...
- [BZOJ 1500] [NOI2005] 维修数列
题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...
- 【BZOJ】1500: [NOI2005]维修数列(splay+变态题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 模板不打熟你确定考场上调试得出来? 首先有非常多的坑点...我遇到的第一个就是,如何pushu ...
- BZOJ 1500 [NOI2005]维修数列 FHQ Treap
终于A了这题...这题还是很好...但是我太菜...重构了三遍qwq FHQ Treap大法好!qwq...~~ Ins:直接拿输入造一棵树,把原来的树split成[1,pos],[pos+1,n], ...
- [NOI2005] 维修数列
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 8397 Solved: 2530 Description In ...
- bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
随机推荐
- 解决windows server 2003不认U盘或移动硬盘
解决windows server 2003不认U盘或移动硬盘1.进入命令提示符环境(也就是DOS) 2.进入DISKPART程序 3.输入AUTOMOUNT ENABLE指令 4.OK,下次USB硬盘 ...
- 前端JS开发框架-DHTMLX--dhtmlXTree
介绍 dhtmlxTree是一个功能丰富的JavaScript树菜单 它允许您快速添加一个好看的,基于ajax的web页面的分层树. treeview支持在线节点编辑.先进的拖放,三态复选框等等.由 ...
- linux 内核---------董昊 ( Robin Dong ) and OenHan
http://oldblog.donghao.org/ http://blog.donghao.org/%E6%97%A7%E5%8D%9A%E5%AE%A2/ http://blog.donghao ...
- tinyxml_settattr
TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); * ...
- C#高级
程序集 程序集概念: 程序集是.net中的概念. .net中的dll与exe文件都是程序集.(exe与dll的区别(exe有程序主入口,可以执行,dll没有主入口,不可运行)) 程序集(Assembl ...
- javaweb 中的乱码问题
一.post 方式 首先我们看下面一段代码,在该HTML中我们指定的编码为“UTF-8”,如图所示. 在该代码中,我们将表单数据提交给ParamServlet 处理 servlet 会将接收到的数据打 ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- c#中的重写方法与隐藏方
1.父类中有方法a,添加virtua修饰符可声明为虚方法,在子类中可以用override声明后重写方法a. 2.父类中有方法a,在子类中可以有new修饰符声明后隐藏父类方法. 子类重写方法后,对于子类 ...
- eclipse下使用maven配置库托管jar包
1.项目是通过maven配置库托管jar包 首先要保证maven配置库中有相应的jar包才能通过这个方法来添加jar包.maven的有点就是把要用到的jar包统一放在一个配置库中,在某个项目需要用到这 ...
- webstorm的默认project编码为系统编码GBK.
使用新的IDE,而不会设置,会给你带来灾难. 如下为我是用webstorm时遇到的文件编码问题. 纳闷很久,终于发现是IDE的设置问题. 参考