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 ...
随机推荐
- 【Asphyre引擎】今天终于把精灵demo基本改好了。
doudou源代码 包含Sprite代码(Sprite还没改完,粒子特效有些问题,但是基本上可以用了) Stage1-1.map 不好意思,漏了地图配置.
- mysql max_allowed_packet过小导致的prepare失败
最近公司一台阿里云上模拟环境突然好好地就出错了额,总提示:"Unknown prepared statement handler (stmt) given to DEALLOCATE PRE ...
- C++之内联函数与constexpr
inline 函数 规模小,流程直接且频繁调用 cout<<shortString(s1,s2)<<endl; = cout<<(s1.size()<s2.s ...
- android:ellipsize实现跑马灯效果总结(转)
最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说 ...
- .net mysql 支持表情
1.表 utf8mb4 2.字段 utf8mb4 3.连接字符串 utf8mb4 4.存储过程参数 utf8mb4
- 基于流的自动化构建工具------gulp (简单配置)
项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...
- elasticsearch的mapping映射
Mapping简述 Elasticsearch是一个schema-less的系统,但并不代表no shema,而是会尽量根据JSON源数据的基础类型猜测你想要的字段类型映射.Elasticsearch ...
- 今天发现新大陆:haml和Emmet
其实一开始小渣渣我只是想接触一下(css预处理器)sass,可是突然冒出一个haml. 原文是酱紫的. Sass 是采用 Ruby 语言编写的一款 CSS 预处理语言,它诞生于2007年,是最大的成熟 ...
- 为网站添加ico图标
1.将目标图片装换为.ico格式 在线转换工具:http://www.bitbug.net/ 2.将装换后的图标放入项目文件中,一般命名为favicon 3.在项目文件的index页面中引入 < ...
- DataTable 转换为ArrayList 再转换成 json 格式
//JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); //javaScriptSeriali ...