【BZOJ1500】【NOI2005】维修数列(Splay)

题面

不想再看见这种毒瘤题,自己去BZOJ看

题解

Splay良心模板题

真的很简单

我一言不发

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define MAX 555555
#define INF 1000000000
#define lson (t[x].ch[0])
#define rson (t[x].ch[1])
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int root,n,m;
int A[MAX];
queue<int> Q;
int Qsize;
struct Node
{
int ch[2],ff;
ll sum,v,size;
int rev,tag;
ll lm,rm,mm;
void init(int w)
{
sum=v=w;size=1;
rev=tag=0;
lm=rm=max(0,w);
mm=w;
}
}t[MAX];
void pushup(int x)
{
t[x].sum=t[lson].sum+t[rson].sum+t[x].v;
t[x].size=t[lson].size+t[rson].size+1;
t[x].lm=max(t[lson].lm,t[lson].sum+t[x].v+t[rson].lm);
t[x].rm=max(t[rson].rm,t[rson].sum+t[x].v+t[lson].rm);
t[x].mm=max(max(t[lson].mm,t[rson].mm),t[lson].rm+t[x].v+t[rson].lm);
}
void rotate(int x)
{
int y=t[x].ff,z=t[y].ff;
int k=t[y].ch[1]==x;
t[z].ch[t[z].ch[1]==y]=x;t[x].ff=z;
t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].ff=y;
t[x].ch[k^1]=y;t[y].ff=x;
pushup(y);pushup(x);
}
void pushdown(int x)
{
if(t[x].tag)//区间覆盖
{
t[x].tag=t[x].rev=0;
if(lson)t[lson].tag=1,t[lson].v=t[x].v,t[lson].sum=t[lson].size*t[x].v;
if(rson)t[rson].tag=1,t[rson].v=t[x].v,t[rson].sum=t[rson].size*t[x].v;
if(t[x].v>=0)
{
if(lson)t[lson].lm=t[lson].rm=t[lson].mm=t[lson].sum;
if(rson)t[rson].lm=t[rson].rm=t[rson].mm=t[rson].sum;
}
else
{
if(lson)t[lson].lm=t[lson].rm=0,t[lson].mm=t[x].v;
if(rson)t[rson].lm=t[rson].rm=0,t[rson].mm=t[x].v;
}
}
if(t[x].rev)
{
t[x].rev^=1;
if(lson)t[lson].rev^=1;
if(rson)t[rson].rev^=1;
swap(t[lson].lm,t[lson].rm);
swap(t[rson].rm,t[rson].lm);
swap(t[lson].ch[0],t[lson].ch[1]);
swap(t[rson].ch[0],t[rson].ch[1]);
}
}
void Splay(int x,int goal)
{
while(t[x].ff!=goal)
{
int y=t[x].ff,z=t[y].ff;
if(z!=goal)
(t[y].ch[1]==x)^(t[z].ch[1]==y)?rotate(x):rotate(y);
rotate(x);
}
if(!goal)root=x;
}
int Rank(int k)
{
int x=root;
while(x)
{
pushdown(x);
if(t[lson].size+1==k)return x;
if(t[lson].size+1<k)k-=t[lson].size+1,x=rson;
else x=lson;
}
}
int Build(int l,int r,int ff)
{
if(l>r)return 0;
int mid=(l+r)>>1;
int x=Q.front();Q.pop();Qsize--;
//printf("Qsize=====%d\n",Qsize);
if(l==r)
{
t[x].ff=ff;
t[x].init(A[mid]);
return x;
}
t[x].v=t[x].mm=A[mid];t[x].ff=ff;
lson=Build(l,mid-1,x);
rson=Build(mid+1,r,x);
pushup(x);
return x;
}
void Insert()
{
int pos=read(),tt=read();
for(int i=1;i<=tt;++i)A[i]=read();
if(!tt)return;
int L=Rank(pos+1),R=Rank(pos+2);
Splay(L,0);Splay(R,L);
t[R].ch[0]=Build(1,tt,R);
pushup(R);pushup(L);
}
void Clear(int x)
{
t[x].ch[0]=t[x].ch[1]=t[x].ff=t[x].size=t[x].sum=t[x].lm=t[x].rm=0;
t[x].mm=-INF;
t[x].rev=t[x].tag=0;
}
void Reuse(int x)
{
if(!x)return;
Q.push(x);Qsize++;
if(lson)Reuse(lson);
if(rson)Reuse(rson);
Clear(x);
}
void Delete()
{
int pos=read(),tt=read();
if(!tt)return;
int L=Rank(pos),R=Rank(pos+tt+1);
Splay(L,0);Splay(R,L);
Reuse(t[R].ch[0]);
t[R].ch[0]=0;
pushup(R);pushup(L);
}
void SetVal()
{
int pos=read(),tt=read();
int vv=read();
int L=Rank(pos),R=Rank(pos+tt+1);
Splay(L,0);Splay(R,L);
int x=t[R].ch[0];
t[x].v=vv;
t[x].tag=1;
t[x].sum=t[x].size*vv;
if(vv>=0)t[x].lm=t[x].rm=t[x].mm=t[x].sum;
else t[x].lm=t[x].rm=0,t[x].mm=vv;
pushup(R);pushup(L);
}
void Reverse()
{
int pos=read(),tt=read();
int L=Rank(pos),R=Rank(pos+tt+1);
Splay(L,0);Splay(R,L);
int x=t[R].ch[0];
if(!t[x].tag)
{
t[x].rev^=1;
swap(lson,rson);
swap(t[x].lm,t[x].rm);
pushup(R);pushup(L);
}
}
void Query_Sum()
{
int pos=read(),tt=read();
int L=Rank(pos),R=Rank(pos+tt+1);
Splay(L,0);Splay(R,L);
printf("%lld\n",t[t[R].ch[0]].sum);
}
void Query_Max_Sum()
{
printf("%lld\n",t[root].mm);
}
int main()
{
n=read();m=read();
A[1]=A[n+2]=-INF;
Clear(0);
for(int i=1;i<=550000;++i)Q.push(i);Qsize=550000;
for(int i=1;i<=n;++i)A[i+1]=read();
root=Build(1,n+2,0);
char ch[50];
while(m--)
{
scanf("%s",ch);
if(ch[0]=='G')Query_Sum();
if(ch[0]=='D')Delete();
if(ch[0]=='R')Reverse();
if(ch[0]=='M'&&ch[2]=='K')SetVal();
if(ch[0]=='M'&&ch[2]=='X')Query_Max_Sum();
if(ch[0]=='I')Insert();
}
}

【BZOJ1500】【NOI2005】维修数列(Splay)的更多相关文章

  1. BZOJ1500: [NOI2005]维修数列[splay ***]

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

  2. [bzoj1500][NOI2005]维修数列——splay

    题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...

  3. BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】

    以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...

  4. [bzoj1500][NOI2005 维修数列] (splay区间操作)

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2行包含N个数字,描述初始时的数列. 以下M行,每 ...

  5. BZOJ1500 [NOI2005]维修数列(Splay tree)

    [Submit][Status][Discuss] Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 Inp ...

  6. bzoj1500: [NOI2005]维修数列 (Splay+变态题)

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 11353  Solved: 3553 [Submit][Status][Discuss] Descrip ...

  7. [BZOJ1500][NOI2005]维修数列 解题报告 Splay

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  8. [BZOJ1500][NOI2005]维修数列---解题报告

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  9. 【BZOJ1500】[NOI2005]维修数列 Splay

    [BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...

  10. 【BZOJ-1500】维修数列 Splay

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 11047  Solved: 3460[Submit][Statu ...

随机推荐

  1. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  2. 【Tools】ubuntu虚拟机Vmware Tools 安装记录

    1.下载VmwareTools 链接: https://pan.baidu.com/s/1c4baji4 密码: h3si 2.终端打开下载文件位置 cd /home/ubuntu/Downloads ...

  3. 区间DP的四边形不等式优化

    今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:

  4. 网页版仿Excel效果组件--handsontable拓展运用

    引言(祝看官们新年万事大吉) 前段时间项目需要实现网页版的excel表格功能,瞬间就想到了handsontable,为什么呢?理由如下:该UI组件功能齐全多样,展示效果也更贴近bootstrap风格, ...

  5. PHP实现WebService的简单示例和实现步骤

    首先我创建的文件有: api.php api的接口类文件 api.wsdl 我创建产生的最后要调用的接口文件 cometrue.php 注册service api类内容的所有内容的执行文件 creat ...

  6. docker数据库

    拉取镜像 # docker pull mysql: 创建docker数据库容器 # docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASS ...

  7. 如何解决jQuery easyui中locale文件下easyui-lang-zh_CN中文乱码问题

    1.在保存eclipse项目的目录下找到引入easyui-lang-zh_CN.js 2.用记事本打开该js文件,若打开后的中文正常,直接复制,粘贴到项目中的该js文件中,保存 3.若打开后中文出现乱 ...

  8. js在工作中遇到的一些问题

    前言 js这种语言没有太多封装好的模式或者统一的编程方式,所以一些细节的问题很容易导致bug,那下面就写为:一份坚固的代码是什么样的. 持续更新一下,记一些good case和bug. 事件绑定的选择 ...

  9. uva225 回溯剪枝

    这道题要剪枝,不然会超时,还有就是每次参加过的城市下次不能再参观,不然会WA. 对于障碍物的坐标我用了两种方法,第一种就是直接用STL里面的set,对于判断是否访问过直接用的count,用时960ms ...

  10. Qt Creator 整合 python 解释器教程

    目录 1. 前言 2.前提条件 3.步骤 3.1 新建 python文件 3.2 编写 python 代码 3.3 配置 python 解释器 3.4 执行 python file 1. 前言 Pyt ...