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]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
随机推荐
- xcode针对不同IOS版本的代码编译问题
有时候在项目中为了兼容低版本IOS系统,通常会针对不同的OS版本写不同的代码,例如: #define IS_IOS7_OR_LATER ([[UIDevice currentDevice].syste ...
- Bash For Loop Examples for Your Linux Shell Scripting--ref
There are two types of bash for loops available. One using the “in” keyword with list of values, ano ...
- 从cmd中进入MySQL的命令界面
两种方式进入mysql命令界面 第一.直接开始界面→搜索mysql客户端登陆界面 第二.从cmd中进入MySQL的命令界面 2010-05-17 10:02:05| 分类: mysql|字号 订阅 ...
- 关于Fragment与Fragment、Activity通信的四种方式
一直想总结一下Fragment与Fragment.Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment.Activity的 ...
- Sql Server 与CLR集成
.NET编程和SQL Server ——Sql Server 与CLR集成 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数等十分有限,经常需要外部 ...
- JAVA的instanceOf什么时候用啊
当你拿到一个对象的引用时(例如参数),你可能需要判断这个引用真正指向的类.所以你需要从该类继承树的最底层开始, 使用instanceof操作符判断,第一个结果为true的类即为引用真正指向的类. cl ...
- Integer跟int的区别(备份回忆)
int与Integer的区别 int 是基本数据类型Integer是其包装类,注意是一个类.为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用.否则 你无法直接通过变量转化.比如, ...
- wap上传图片跨域发送post请求
wap和接口交互是跨域请求,一般只能通过Jsonp来进行数据的吞吐,然而jsonp只是GET请求,不能发送post请求,所以会对项目需求有所限制. 需求:wap跨域通过接口上传图片. 条件:接口是C# ...
- 转载--SQL Server 2005的XQuery介绍
原文地址: http://bbs.51cto.com/thread-458009-1-1.html 引用: 摘要 本文介绍了SQL Server 2005能够支持的XQuery的各方面特性如FLW ...
- iOS 项目中将 http 改成 https 后需要改动的地方(密钥验证)
这种是不验证证书的密钥 AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone] ...