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. GJM : Unity3D HIAR -【 快速入门 】 五、导出 Android 工程、应用

    导出 Android 工程.应用 在开始之前,请务必先保存您的工程,同时确认您已经安装 Android SDK 和 JDK.安装操作请参考以下链接: 搭建开发环境 Step 1. 设置 Android ...

  2. ASP.NET中后台数据和前台控件的绑定

    关于ASP.NET中后台数据库和前台的数据控件的绑定问题 最近一直在学习个知识点,自己创建了SQL Server数据库表,想在ASP.NET中连接数据库,并把数据库中的数据显示在前台,注意,这里的数据 ...

  3. Windows Form调用R进行绘图并显示

    R软件功能非常强大,可以很好的进行各类统计,并能输出图形.下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上. 1 前提准备 安装R软件,需要安装32位的R软件,6 ...

  4. iOS之数字的格式化

    //通过NSNumberFormatter,同样可以设置NSNumber输出的格式.例如如下代码: NSNumberFormatter *formatter = [[NSNumberFormatter ...

  5. UIView的layoutSubviews和drawRect方法何时调用

    首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubvi ...

  6. DXGI 1.5新特性

    为了支持更具弹性和的输出设定和副本机制,DXGI1.5添加了下面这些功能: 高动态范围(HDR)和宽色域(WCG) 可变刷新率显示 复制输出 奉献和再生资源 高动态范围(HDR)和宽色域(WCG) H ...

  7. linux memcached安装

    准备安装包: libevent-2.0.21-stable.tar.gz  //Memcached服务端的依赖包 memcached-1.4.29.tar.gz   //Memcached服务端 li ...

  8. MVC 后台管理框架 FineUIMvc 在线示例

     FineUIMvc 在线示例 基础版下载

  9. CAS Client集群环境的Session问题及解决方案

    [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 之前写过一篇文章,介绍单点登录的基本原理.这篇文章重点介绍开源单点登录系统CAS的登录和注销的实现方法.并结合实际工作中碰到的问题,探讨 ...

  10. MySQL Performance-Schema(二) 理论篇

    MySQL Performance-Schema中总共包含52个表,主要分为几类:Setup表,Instance表,Wait Event表,Stage Event表Statement Event表,C ...