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. java web学习总结(二十三) -------------------编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  2. 评《撸一段 SQL ? 还是撸一段代码? 》

    最近看到一篇博客<撸一段 SQL ? 还是撸一段代码?>,文章举例说明了一个连表查询使用程序code来写可读性可维护性更好,但是回帖意见不一致,我想作者在理论层面没有做出更好的论述,而我今 ...

  3. SharePoint 2013 入门教程

    以下文章是自己在学习SharePoint的过程中,不断积累和总结的博文,现在总结一个目录,分享给大家.这个博客也是自己从SharePoint入门,到一个SharePoint开发的成长记录,里面记录的都 ...

  4. asp.net web api 的版本升级到 2.2的记录

    asp.net web api 的版本 升级到 2.2的记录 asp.net web api 2.2相比1.0提升了不少 而且其中最重要的就是有了在线文档的自动字段注释的功能 再也不用写详细的字段说明 ...

  5. iOS存储数据字典到沙盒

    1.创建一个账号数据模型 用来存放从服务器返回的数据,一般返回的是一个字典,里面包含了这个登陆用户的各种信息,这个数据模型就是用来存放这些东西的 创建一个数据模型  YYCAccount 继承 NSO ...

  6. jQuery Validate 表单验证 — 用户注册简单应用

    相信很多coder在表单验证这块都是自己写验证规则的,今天我们用jQuery Validate这款前端验证利器来写一个简单的应用. 可以先把我写的这个小demo运行试下,先睹为快.猛戳链接--> ...

  7. js 常用的正则表达式

    以下收录一些我经常用到的正则表达式,因为工作场景中用到正则的地方几乎都跟validate插件的验证有关系, 所以以下正则也是$.validator.addMethod() 的拓展: validate: ...

  8. 6-1 bash脚本编程之四 整数测试及特殊变量

    1. exit:退出脚本.可以定义,如 #exit 数字(0-255) 2. 文件测试 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通 -d FILE:测试指定路径是否为目录 - ...

  9. protobuf学习(2)-相关学习资料

    protobuf官方git地址 protobuf官方英文文档   (你懂的需要FQ) protobuf中文翻译文档 protobuf概述          (官方翻译 推荐阅读) protobuf入门 ...

  10. Java程序设计之算出一年第多少天

    可以直接拷贝运行. package year; import java.util.Scanner; public class year { public static void main(String ...