BZOJ 1500 维修数列【Splay】
注意: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】的更多相关文章
- [BZOJ 1500]维修数列 [Splay Tree从进阶到住院]
历尽艰辛终于A掉了这题QwQ 贴COGS评论区几句话=.= 策爷:"splay/块状链表的自虐题.".深刻理解到如果没有M倾向就不要去写这题了.. -Chenyao2333 记得b ...
- bzoj 1500 维修数列
splay乱搞. 调了两个多小时...这辈子再也不想写splay了... 维护左边最大连续和右边最大连续,维护两个标记,无脑push_down.push_up就行了. 注意最大连续和至少要包含一个数. ...
- 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】维修数列 Splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 11047 Solved: 3460[Submit][Statu ...
- 【BZOJ1500】[NOI2005]维修数列 Splay
[BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...
- [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...
- BZOJ1500 [NOI2005]维修数列(Splay tree)
[Submit][Status][Discuss] Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 Inp ...
- BZOJ1500: [NOI2005]维修数列[splay ***]
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 12278 Solved: 3880[Submit][Statu ...
随机推荐
- css中的定位和框模型问题
和定位有关的元素属性如下 position 元素的定位类型 绝对定位会相对于最近定位的祖先元素的位置来定位,而不会影响其他框的位置 固定定位 相对定位 z-index 元素的堆叠顺序 值越大 ...
- C++ 面向对象的三个特点--继承与封装(一)
面试的时候经常会有很多概念性的东西,许久不用都会很生疏,特意整理一下方便自己以后不记得了可以查看一下,也顺便帮助自己复习一下. 概念 继承是面向对象程序设计的一个重要特性,它允许在既有类的基础上创建新 ...
- TeamCity配置笔记
1.编译sln 2.发布网站 3.重复代码检测 4.代码分析 5.单元测试&覆盖率测试 查看代码覆盖率 7.代码签入时自动触发编译 8.通知 1.在teamcity安装目录中找到TrayNot ...
- css3实现动态圆形导航栏
核心问题: 1.圆形怎样实现? css3的圆角属性:border-radius:__ px; 把值设大点就圆啦. 2.怎样实现动画效果? css3的transition属性:transition:__ ...
- 使用svcutil.exe 工具来生成调用文件
svcutil.exe http://localhost:9065/ServiceDemo.svc?wsdl 这将生成一个配置文件和一个包含客户端类的代码文件. 下面我们就用这个是怎么生成的: 1,打 ...
- 使用Lucene.NET实现简单的站内搜索
使用Lucene.NET实现简单的站内搜索 导入Lucene.NET 开发包 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和 ...
- 【读书笔记】iOS-NSDate
+dateWithTimeIntervalSinceNow:接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔.通过该参数可以指定时间偏移的方式:对于将来的时间, ...
- JAVA基础学习day14--集合一
一.集合的出现 1.1.集合简述 面向对象语言对事物的体现都是以对象形式,为了方便对多个对象的操作,就对象对象进行存储,集合就是存仪储对象最常用的一种试 1.2.数组和集合都是容器 数组也存对象,存储 ...
- 错误:找不到类org.springframework.web.context.ContextLoaderListener
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis ...
- RunTime(运行时机制)
1>runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语 ...