Description

网上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列 要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】 给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2. 将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。

Input

第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

Output

对于每个第3种操作,给出正确的回答。

Sample Input

4 4
1 1 3 2
1 2 4 -1
2 1 3
3 2 4

Sample Output

2
【数据范围】
N<=50000,M<=100000。
 
splay 。终于把这个splay的题写出来了。明天去挑战维护序列。
 #include<cstdio>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
const int N=;
int c[N][],tag[N],w[N],mx[N],rev[N],size[N],fa[N],id[N];
int m,n,rt;
void pushdown(int x){
int l=c[x][],r=c[x][];
if (rev[x]){
rev[l]^=;rev[r]^=;
rev[x]=;
swap(c[x][],c[x][]);
}
if (tag[x]){
if(l)tag[l]+=tag[x],mx[l]+=tag[x],w[l]+=tag[x];
if (r)tag[r]+=tag[x],mx[r]+=tag[x],w[r]+=tag[x];
tag[x]=;
}
} void updata(int x){
int l=c[x][],r=c[x][];
size[x]=size[l]+size[r]+;
mx[x]=max(mx[l],mx[r]);
mx[x]=max(mx[x],w[x]);
} void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if (c[y][]==x)l=;else l=;r=l^;
if (y==k) k=x;
else if (c[z][]==y) c[z][]=x;else c[z][]=x;
fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
updata(y);updata(x);
} void splay(int x,int &k){
while (x!=k){
int y=fa[x],z=fa[y];
if (y!=k){
if (c[y][]==x^c[z][]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} int find(int &k,int rk){
pushdown(k);
int l=c[k][],r=c[k][];
if (size[l]+==rk) return k;
if (size[l]>=rk) return find(l,rk);
return find(r,rk-size[l]-);
} void build(int l,int r,int f){
if (l>r) return;
int mid=(l+r)>>,now=id[mid],last=id[f];
if (l==r){
size[l]=;tag[l]=rev[l]=;
fa[l]=last;
if(l<f)c[last][]=now;
else c[last][]=now;
return;
}
build(l,mid-,mid);build(mid+,r,mid);
fa[now]=last;updata(now);
if (mid>=f)c[last][]=now;else c[last][]=now;
} void add(int l,int r,int v){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt); splay(y,c[x][]);
int z=c[y][];
tag[z]+=v;mx[z]+=v;w[z]+=v;
} void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,c[x][]);
int z=c[y][];
rev[z]^=;
} int solvemx(int l,int r){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,c[x][]);
int z=c[y][];
return mx[z];
} int main(){
scanf("%d%d",&n,&m);
mx[]=-inf;//注意这里有负数,所以mx[0]要定义最小值
for (int i=;i<=n+;i++) id[i]=i;
build(,n+,);rt=(n+)>>;
int opt,l,r,v;
for (int i=;i<m;i++){
scanf("%d%d%d",&opt,&l,&r);
switch (opt){
case :scanf("%d",&v);add(l,r,v);break;
case :rever(l,r);break;
case :printf("%d\n",solvemx(l,r));break;
}
//for (int j=1;j<=n;j++)printf("%d ",solvemx(j,j));
}
}

【BZOJ1251】序列终结者的更多相关文章

  1. [BZOJ1251]序列终结者

    [BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...

  2. [bzoj1251]序列终结者_splay

    序列终结者 bzoj-1251 题目大意:给定一个长度为n的正整数序列,支持区间加,区间反转,查询区间最大值.所有元素开始都是0. 注释:$1\le n\le 5\cdot 10^4$,操作个数不多于 ...

  3. bzoj1251 序列终结者(Splay Tree+懒惰标记)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  4. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  5. [bzoj1251]序列终结者——splay

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  6. BZOJ1251 序列终结者(Splay平衡树)(占位)

    网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量…… ...

  7. BZOJ1251——序列终结者

    给你一个数列,让你实现区间加上一个值,区间翻转,区间最大值 裸splay,懒标记一发即可 #include <cstdio> #include <cstdlib> #inclu ...

  8. bzoj1251 序列终结者(splay)

    人生第一发splay,写得巨丑,最后忘记了push_down以后要将子节点maintain 9k代码不忍直视 #define NDEBUG #include<cstdio> #includ ...

  9. 题解【bzoj1251 序列终结者】

    Description 维护三个操作:区间加,区间翻转,区间求最大值.\(n \leq 50000\) Solution fhqtreap大法好! 模板题(我是不会告诉你这篇题解是用来存个代码的 Co ...

  10. bzoj1251: 序列终结者 fhqtreap写法

    fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...

随机推荐

  1. LeetCode 258

    Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...

  2. hdu 3093 动态规划

    思路:直接引用论文的话. 暂时先不考虑“使剩下的物品都放不下”的条件,那就是求 0-1 背包的所有可行方案. 用 Fi[j]表示前 i 件物品中选若干件总体积为 j 的方案数,初始为 F0[0]=1, ...

  3. (转)linuxmint,ubuntu 下修改guake宽度方法

    之前在网上找到修改guake.py的方式,但是我一直没能找到guake.py的文件,弄的我纠结,后来找到这个文章,这个确实是有效果的 Ubuntu12.04上Guake在唤出的时候滚动条会消失,主要原 ...

  4. JMS - Exceptions

    The JMSException JMS defines JMSException as the root class for exceptions thrown by JMS methods. JM ...

  5. hiho拓扑排序专题 ——第四十八、四十七周

    拓扑排序·一 分析: 此题就是求一个有向图中是否存在环. 如存在环则输出"Wrong", 若不存在环, 说明课程安排的合理,输出"Correct". 题中的提示 ...

  6. Android之自定义画图文字动画

    结构: BaseView: package com.caiduping.canvas; import android.content.Context; import android.graphics. ...

  7. BLK-MD-BC04-B蓝牙模块的资料

    BLK-MD-BC04-B蓝牙模块的资料   蓝牙模块说明 蓝牙模块 波特率 波特率从1200到1382400,具体可以参考波特率列表.     电平接口 答:模块的接口是SPP电平,电压为3.3V. ...

  8. [Entity Framework] MySQL @ Entity Framework 6

    原文 [Entity Framework] MySQL @ Entity Framework 6 要让MySQL能够用EF6,我花了一点时间,在此记录一下 安装元件 在设定档加入Provider 安装 ...

  9. CAD输出的局部平面坐标数据配准转换到WGS84坐标系

             局部平面坐标                                             平移纠正到常用平面坐标系下的坐标            转换后的地理坐标 采用两 ...

  10. Trie树入门及训练

    什么叫Trie树? Trie树即字典树. 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本 ...