splay乱搞。

调了两个多小时。。。这辈子再也不想写splay了。。。

维护左边最大连续和右边最大连续,维护两个标记,无脑push_down、push_up就行了。

注意最大连续和至少要包含一个数。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 500010
#define M 5000005
#define inf 0x3f3f3f3f
#define lc(x) ch[x][0]
#define rc(x) ch[x][1]
using namespace std;
int n,m;
int cnt;
int a[N],root,ch[N][],tmproot;
int sum[N],ls[N],rs[N],mx[N],ji[N];
int lazy[N],size[N],zhi[N],fa[N];
int s[M],tot2;
inline int mxx(int x,int y)
{
if(x>y)return x;return y;
}
// ls 左边最大 rs 右边最大
void push_up(int x)
{
size[x]=size[lc(x)]+size[rc(x)]+;
sum[x]=sum[lc(x)]+sum[rc(x)]+zhi[x];
mx[x]=mxx(mx[lc(x)],mxx(mx[rc(x)],zhi[x]+rs[lc(x)]+ls[rc(x)]));
ls[x]=mxx(,mxx(ls[lc(x)],sum[lc(x)]+zhi[x]+ls[rc(x)]));
rs[x]=mxx(,mxx(rs[rc(x)],sum[rc(x)]+zhi[x]+rs[lc(x)]));
return ;
}
void push_down(int x)
{
int l=ch[x][];int r=ch[x][];
if(ji[x]!=-)
{
ji[l]=ji[r]=ji[x];
sum[l]=size[l]*ji[x];sum[r]=size[r]*ji[x];
zhi[l]=zhi[r]=ji[x];
if(ji[x]>)ls[l]=rs[l]=mx[l]=sum[l],ls[r]=rs[r]=mx[r]=sum[r];
else ls[l]=rs[l]=,ls[r]=rs[r]=,mx[l]=mx[r]=ji[x];
ji[x]=-;
}
if(lazy[x]==)
{
lazy[l]^=;lazy[r]^=;
swap(ch[l][],ch[l][]);
swap(ch[r][],ch[r][]);
swap(ls[l],rs[l]);swap(ls[r],rs[r]);
lazy[x]=;
}
sum[]=ls[]=rs[]=;mx[]=-inf;
return ;
}
void build(int x,int l,int r)
{
if(l==r)
{
size[x]=;
sum[x]=zhi[x]=mx[x]=a[l];
rs[x]=ls[x]=max(,a[l]);
return ;
}
int mid=(l+r)>>;
if(l!=mid)
{
if(tot2)ch[x][]=s[tot2--];
else ch[x][]=++cnt;
fa[ch[x][]]=x,build(ch[x][],l,mid-);
}
if(tot2)ch[x][]=s[tot2--];
else ch[x][]=++cnt;
fa[ch[x][]]=x,build(ch[x][],mid+,r);
zhi[x]=a[mid];
push_up(x);
}
void rotate(int p)
{
int q=fa[p],y=fa[q],x=(ch[q][]==p);
ch[q][x]=ch[p][x^];fa[ch[q][x]]=q;
ch[p][x^]=q;fa[q]=p;
fa[p]=y;
if(y)
{
if(ch[y][]==q)ch[y][]=p;
else ch[y][]=p;
}
push_up(q);
return ;
}
void splay(int x,int yy)
{
for(int y;y=fa[x];rotate(x))
{
if(y==yy)break;
if(fa[y]!=yy)
{
if((lc(fa[y])==y&&lc(y)==x)||(rc(fa[y])==y&&rc(y)==x))rotate(y);
else rotate(x);
}
}
push_up(x);
if(!yy)root=x;
}
int find(int k,int x)
{
push_down(k);
int l=lc(k),r=rc(k);
if(size[l]+==x)return k;
if(size[l]+>x)return find(l,x);
else return find(r,x-size[l]-);
}
char c[];
void dfs(int x)
{
if(!x)return ;
cout<<zhi[x]<<' '<<sum[x]<<' '<<size[x]<<endl;
dfs(ch[x][]);dfs(ch[x][]);
}
void del(int x)
{
if(!x)return ;
s[++tot2]=x;ji[x]=-;lazy[x]=;sum[x]=;
del(ch[x][]);del(ch[x][]);
ch[x][]=ch[x][]=;fa[x]=;size[x]=;
}
int main()
{
scanf("%d%d",&n,&m);
mx[]=-inf;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<N;i++)ji[i]=-;
root=++cnt;
a[]=a[n+]=;
build(cnt,,n+);
int t1,t2,t3,t4,t5,t6;
for(int i=;i<=m;i++)
{
scanf("%s",c);
if(c[]=='I')
{
scanf("%d%d",&t1,&t2);
for(int j=;j<=t2;j++)scanf("%d",&a[j]);
if(tot2)tmproot=s[tot2--];
else tmproot=++cnt;
build(tmproot,,t2);
t1++;t3=find(root,t1);
splay(t3,);
t4=ch[t3][];push_down(t4);
while(ch[t4][])t4=ch[t4][],push_down(t4);
splay(t4,t3);ch[t4][]=tmproot;fa[tmproot]=t4;push_up(t4);push_up(t3);
}
else if(c[]=='D')
{
scanf("%d%d",&t1,&t2);
t3=find(root,t1);
splay(t3,);
t2=t2+t1+;
t4=find(root,t2);
splay(t4,t3);
del(ch[t4][]);
ch[t4][]=;
push_up(t4);push_up(t3);
}
else if(c[]=='R')
{
scanf("%d%d",&t1,&t2);
t3=find(root,t1);splay(t3,);t2=t2+t1+;t4=find(root,t2);
splay(t4,t3);
t5=ch[t4][];
lazy[t5]^=;swap(ch[t5][],ch[t5][]);swap(ls[t5],rs[t5]);
push_up(t4);push_up(t3);
}
else if(c[]=='G')
{
scanf("%d%d",&t1,&t2);
t3=find(root,t1);
splay(t3,);t2=t2+t1+;
t4=find(root,t2);
splay(t4,t3);
printf("%d\n",sum[ch[t4][]]);
}
else if(c[]=='M'&&c[]=='S')
{
t1=find(root,);
splay(t1,);
t2=find(root,size[root]);
splay(t2,t1);
printf("%d\n",mx[ch[t2][]]);
}
else
{
scanf("%d%d%d",&t1,&t2,&t6);
t3=find(root,t1);splay(t3,);t2=t2+t1+;
t4=find(root,t2);
splay(t4,t3);
t5=ch[t4][];
ji[t5]=t6;zhi[t5]=t6;sum[t5]=size[t5]*t6;
if(t6>)ls[t5]=rs[t5]=mx[t5]=sum[t5];
else ls[t5]=rs[t5]=,mx[t5]=t6;
push_up(t4);push_up(t3);
}
}
return ;
}

bzoj 1500 维修数列的更多相关文章

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

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

  2. BZOJ 1500 维修数列【Splay】

    注意:1,内存限制,所以需要回收删除的点 2,当前节点的左连续区间和最大值=max(左子树的左连续区间和最大值,左子树的总和+当节点的值+max(右子树的左连续区间和最大值,0)):右连续区间和最大值 ...

  3. bzoj 1500 维修序列

    Written with StackEdit. Description 请写一个程序,要求维护一个数列,支持以下 \(6\) 种操作: 请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格 I ...

  4. HYSBZ 1500 维修数列(伸展树模板)

    题意: 题解:典型伸展树的题,比较全面. 我理解的伸展树: 1 伸展操作:就是旋转,因为我们只需保证二叉树中序遍历的结果不变,所以我们可以旋转来保持树的平衡,且旋转有左旋与右旋.通过这种方式保证不会让 ...

  5. 【BZOJ】1500: [NOI2005]维修数列

    [算法]splay [题解]数据结构 感谢Occult的模板>_<:HYSBZ 1500 维修数列 #include<cstdio> #include<cctype> ...

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

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

  7. [BZOJ 1500] [NOI2005] 维修数列

    题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...

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

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

  9. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

随机推荐

  1. ORM是什么?如何理解ORM

    一.ORM简介         对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使 ...

  2. Css3新特性应用之形状

    一.自适应椭圆 * border-radius特性:    * 可以单独指定水平和垂直半径,并且值可以是百分比,用/(斜杠)分隔这两个值即可(可以实现自适应宽度椭圆).    * 还可以单独指定四个角 ...

  3. 如何判断一个DOM元素正在动画,一个CSS“阻塞”JS的例子

    一般情况下CSS不会直接影响JS的程序逻辑,但是以CSS实现动画的话,这个便不太确定了,这个故事发生在与UED迁移全局样式的过程. 曾经我有一段实现弹出层隐藏动画的代码是这个样子的: if (this ...

  4. 可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用

    问题一:Nullable<T>可赋值为null 先看两行C#代码 int? i1 = null; int? i2 = new int?(); int? 即Nullable<int&g ...

  5. Newtonsoft.Json 自定义 解析协议

    在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求 这种情况就需要自定义json序列话的 解析协议了 Newtonsoft.Json默认的解析协议是 ...

  6. 基于Python+Django的Kubernetes集群管理平台

    ➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...

  7. 一步步学习 Spring Data 系列之JPA(一)

    引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...

  8. ITIS-资料集合贴

    ITIS-资料集合贴 说明:这个贴用于收集笔者能力范围内收集收藏并认为有用的资料,方便各方参考,免去到处找寻之苦,提升信息的交叉引用价值.另外,笔者就自己感悟做了部分评注,且可能尝试不断的优化分类和排 ...

  9. jsp中的@include与jsp:include区别详解

    1 前言 搞java开发的人也许都知道在jsp中引入项目中其他文件有如下两种方式 <%@include file="xxx.jsp"%> <jsp:include ...

  10. php在5.5.0默认提供了Zend OPcache

    eaccelerator无法兼容php5.5.0,好在php在5.5.0默认提供了Zend OPcache,所以一直习惯eaccelerator的朋友如果要升级到php5.5.0的话,可能要暂时和ea ...