注意:1,内存限制,所以需要回收删除的点

   2,当前节点的左连续区间和最大值=max(左子树的左连续区间和最大值,左子树的总和+当节点的值+max(右子树的左连续区间和最大值,0));右连续区间和最大值同理

     当前节点的区间和最大值=max(左子树的区间和最大值,max(右子树的区间和最大值,max(左子树的右连续区间和最大值,0)+max(右子树的左连续区间和最大值,0)+当前节点的值))

   3,pushdown时,应该交换左子树的左连续区间和最大值与左子树的右连续区间和最大值。因为向上更新时这两个值的不同对结果有影响,不能延迟更新。

 #include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=;
const int INF=0x7fffffff;
int data[N],fa[N],id,root;
int size[N],sum[N],a[N];
int t[N][],st[N],top;
int mxl[N],mxr[N],mxm[N];
int same[N],flip[N];
void re(int x);
inline void pushup(int x){
int l=t[x][],r=t[x][];
sum[x]=sum[l]+sum[r]+data[x];
size[x]=size[l]+size[r]+;
mxl[x]=max(mxl[l],sum[l]+data[x]+max(mxl[r],));
mxr[x]=max(mxr[r],sum[r]+data[x]+max(mxr[l],));
mxm[x]=max(mxm[l],mxm[r]);
mxm[x]=max(mxm[x],max(mxr[l],)+data[x]+max(mxl[r],));
}
inline void pushdown(int x){
int l=t[x][],r=t[x][];
if(flip[x]){
flip[x]=;
swap(t[x][],t[x][]);
if(l){
flip[l]^=;
swap(mxl[l],mxr[l]);
}
if(r){
flip[r]^=;
swap(mxl[r],mxr[r]);
}
}
if(same[x]!=-INF){
if(l){
same[l]=data[l]=same[x];
sum[l]=same[l]*size[l];
mxl[l]=mxr[l]=mxm[l]=max(data[l],sum[l]);
}
if(r){
same[r]=data[r]=same[x];
sum[r]=same[r]*size[r];
mxl[r]=mxr[r]=mxm[r]=max(data[r],sum[r]);
}
same[x]=-INF;
}
}
void Rotate(int x,int w){
int y=fa[x],z=fa[y];
pushdown(y);
t[y][!w]=t[x][w];
fa[t[x][w]]=y;
fa[x]=z;
t[z][t[z][]==y]=x;
t[x][w]=y;
fa[y]=x;
pushup(y);
}
void Splay(int x,int y){
if(x!=y){
pushdown(x);
while(fa[x]!=y){
if(t[fa[x]][]==x)
Rotate(x,);
else
Rotate(x,);
}
pushup(x);
if(!y)root=x;
} }
void newnode(int &x,int y,int v){
if(top>)
x=st[top--];
else
x=++id;
flip[x]=t[x][]=t[x][]=;
mxl[x]=mxr[x]=mxm[x]=sum[x]=data[x]=v;
same[x]=-INF;
fa[x]=y;
size[x]=;
}
void build(int &x,int y,int l,int r){
if(l<=r){
int mid=(l+r)>>;
newnode(x,y,a[mid]);
build(t[x][],x,l,mid-);
build(t[x][],x,mid+,r);
pushup(x);
}
}
void init(int n){
top=root=id=;
t[][]=t[][]=fa[]=sum[]=size[]=data[]=flip[]=;
same[]=mxl[]=mxr[]=mxm[]=-INF;
newnode(root,,-INF);
newnode(t[][],,-INF);
build(t[][],,,n);
pushup();
pushup();
}
int Select(int k){
pushdown(root);
int x=root;k++;
for(;size[t[x][]]+!=k;){
if(size[t[x][]]+>k)
x=t[x][];
else
k-=size[t[x][]]+,x=t[x][];
pushdown(x);
}
return x;
}
void Insert(int c,int n){
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
int cc=Select(c+);
c=Select(c);
Splay(c,);
Splay(cc,c);
build(t[cc][],cc,,n);
pushup(cc);
pushup(c);
}
void recall(int x){
if(x){
st[++top]=x;
recall(t[x][]);
recall(t[x][]);
}
}
void Delete(int l,int r){
r=Select(r+);
l=Select(l-);
Splay(l,);
Splay(r,l);
recall(t[r][]);
t[r][]=;
pushup(r);
pushup(l);
}
void Flip(int l,int r){
r=Select(r+);
l=Select(l-);
Splay(l,);
Splay(r,l);
flip[t[r][]]^=;
swap(mxl[t[r][]],mxr[t[r][]]);
}
void Same(int l,int r,int v){
r=Select(r+);
l=Select(l-);
Splay(l,);
Splay(r,l);
int x=t[r][];
same[x]=data[x]=v;
sum[x]=data[x]*size[x];
mxl[x]=mxr[x]=mxm[x]=max(v,sum[x]);
pushup(r);
pushup(l);
}
int Sum(int l,int r){
r=Select(r+);
l=Select(l-);
Splay(l,);
Splay(r,l);
return sum[t[r][]];
}
int Max(int l,int r){
l=Select(l-),r=Select(r+);
Splay(l,),Splay(r,l);
return mxm[t[r][]];
}
void de(){
for(int i=;i<=id;i++){
printf("%d %d %d %d %d++\n",i,t[i][],t[i][],sum[i],mxm[i]);
}
}
void re(int x){
if(x){
re(t[x][]);
printf("%d ",data[x]);
re(t[x][]);
}
}
int main(){
int n,m,i,p,cnt,v;
char op[];
while(scanf("%d%d",&n,&m)!=EOF){
for(i=;i<=n;i++) scanf("%d",&a[i]);
init(n);
//de();
while(m--){
scanf("%s",op);
if(!strcmp(op,"GET-SUM")){
scanf("%d%d",&p,&cnt);
printf("%d\n",Sum(p,p+cnt-));
}
if(!strcmp(op,"MAX-SUM")){
printf("%d\n",Max(,size[root]-));
}
if(!strcmp(op,"INSERT")){
scanf("%d%d",&p,&cnt);
Insert(p,cnt);
}
if(!strcmp(op,"DELETE")){
scanf("%d%d",&p,&cnt);
Delete(p,p+cnt-);
}
if(!strcmp(op,"MAKE-SAME")){
scanf("%d%d%d",&p,&cnt,&v);
Same(p,p+cnt-,v);
}
if(!strcmp(op,"REVERSE")){
scanf("%d%d",&p,&cnt);
Flip(p,p+cnt-);
}
}
}
return ;
}
/*
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
*/

BZOJ 1500 维修数列【Splay】的更多相关文章

  1. [BZOJ 1500]维修数列 [Splay Tree从进阶到住院]

    历尽艰辛终于A掉了这题QwQ 贴COGS评论区几句话=.= 策爷:"splay/块状链表的自虐题.".深刻理解到如果没有M倾向就不要去写这题了.. -Chenyao2333 记得b ...

  2. bzoj 1500 维修数列

    splay乱搞. 调了两个多小时...这辈子再也不想写splay了... 维护左边最大连续和右边最大连续,维护两个标记,无脑push_down.push_up就行了. 注意最大连续和至少要包含一个数. ...

  3. bzoj 1500: [NOI2005]维修数列 splay

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 6556  Solved: 1963[Submit][Status ...

  4. BZOJ 1500: [NOI2005]维修数列 (splay tree)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 4229  Solved: 1283[Submit][Status ...

  5. 【BZOJ-1500】维修数列 Splay

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

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

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

  7. [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...

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

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

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

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

随机推荐

  1. OC静态库里NSClassFromString得到nil的解决

    如果你在静态库中有从类名反射回类的代码, 如下: NSString *myClassStr = @"myClass"; Class myClazz = NSClassFromStr ...

  2. RHEL7文件管理

    Linux系统目录结构 主要目录说明 目录 说明 / 通常称为根分区所有的文件和目录的起始点只有root用户对此目录拥有写权限 /home 普通用户的宿主目录 /root 超级用户的宿主目录 /dev ...

  3. DevExpress.XtraGrid.Views 设置指定行的背景颜色 .

    如需要将指定行的背景设置颜色,可参考以下示例 1.事件:CustomDrawCell 2.示例: private void gridView1_CustomDrawCell(object sender ...

  4. 安卓开发_浅谈OptionsMenus(选项菜单)

    Android平台下所提供的菜单大体上可分为三类:选项菜单.上下文菜单和子菜单. 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端弹出相应的选项菜单.但这个功能需要开 ...

  5. Swift学习--闭包中的懒加载(四)

    class ViewController: UIViewController { //格式:定义变量时前使用lazy来修饰变量,后面通过等到赋值一个闭包 // 注意点:1.必须是用var 2.闭包后面 ...

  6. 朝花夕拾-android 自定义toast

    在一个只有你而且还未知的世界中,不去探索未知,死守一处,你到底在守什么呢? 作为一个目前的android程序员,可能过去写着delphi的代码,可能未来回去搭建服务器.不管怎样,你现在是一名安卓程序员 ...

  7. iOS之UI--涂鸦画板实例 (有待更新)

    首先是搭建框架 其他的略过,直接展示效果: 然后接下来上传搭建好两个控制器框架的源码百度云下载链接: http://pan.baidu.com/s/1skjpDox 密码: ardx ,工程里面还有我 ...

  8. jQuery 插件开发文章收集

    A jQuery plugin boilerplate http://jonathannicol.com/blog/2012/05/06/a-jquery-plugin-boilerplate/ jQ ...

  9. swap分区

    swap分区 一块的新加进来的硬盘,我们要怎么给它创建swap分区呢?要遵循下面四个步骤: (1)使用一个现有的分区,比如记为A (2)然后分区类型的16进制编码,即A的16进制编码. (3)格式化A ...

  10. 《MySQL技术内幕——SQL编程》读书笔记(二)——数据类型

    对数据类型的选择将影响与数据库交互的应用程序的性能. 1.通常来说,如果一个页内可以存放尽可能多的行,那么数据库的性能就越好,因此选择一个正确的数据类型至关重要. 2.另一方面,如果在数据库中创建表时 ...