题面:

1251: 序列终结者

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 5367  Solved: 2323
[Submit][Status][Discuss]

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。
 
思路:
参考hzwer博客
一开始一直没看懂平衡树到底是怎么维护的,后面看了下其他人博客,平衡树维护的是区间。
 
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 5e4+;
const int inf = 0x3f3f3f;
int n,m,sz,rt;
int c[M][],fa[M],id[M],tag[M],v[M],mx[M],siz[M];
bool rev[M];
inline void pushup(int k){
int l = c[k][],r = c[k][];
mx[k] = max(max(mx[l],mx[r]),v[k]);
siz[k] = siz[l] + siz[r] + ;
} void pushdown(int k){
int l = c[k][],r = c[k][],t = tag[k];
if(t){
tag[k] = ;
if(l) tag[l]+=t,mx[l]+=t,v[l]+=t;
if(r) tag[r]+=t,mx[r]+=t,v[r]+=t;
}
if(rev[k]){
rev[k] = ; rev[l]^=; rev[r]^=;
swap(c[k][],c[k][]);
}
} 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;
pushup(y); pushup(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){
if(tag[k]||rev[k]) pushdown(k);
int l = c[k][],r = c[k][];
if(siz[l]+==rk) return k;
else if(siz[l]>=rk) return Find(l,rk);
else return Find(r,rk-siz[l]-);
} inline void update(int l,int r,int val){
int x = Find(rt,l),y = Find(rt,r+);
splay(x,rt); splay(y,c[x][]);
int z = c[y][];
tag[z] += val;v[z] += val; mx[z] += val;
} inline 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] ^= ;
} inline void query(int l,int r){
int x = Find(rt,l),y = Find(rt,r+);
splay(x,rt); splay(y,c[x][]);
int z = c[y][];
printf("%d\n",mx[z]);
} inline void build(int l,int r,int f){
if(l > r) return ;
int now = id[l],last = id[f];
if(l == r){
fa[now] = last;siz[now]=;
if(l < f) c[last][] = now;
else c[last][] = now;
return ;
}
int mid = (l + r) >> ; now = id[mid];
build(l,mid-,mid); build(mid+,r,mid);
fa[now] = last; pushup(now);
if(mid < f) c[last][] = now;
else c[last][] = now;
} int main()
{
mx[] = -inf;
scanf("%d%d",&n,&m);
for(int i = ;i <= n+;i ++)
id[i] = ++sz;
build(,n+,); rt = (n + ) >> ;
for(int i = ;i <= m;i ++){
int f,l,r,val;
scanf("%d",&f);
scanf("%d%d",&l,&r);
if(f == ) scanf("%d",&val),update(l,r,val);
if(f == ) rever(l,r);
if(f == ) query(l,r);
}
return ;
}

「BZOJ1251」序列终结者 (splay 区间操作)的更多相关文章

  1. 【BZOJ1251】序列终结者 Splay

    一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...

  2. CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)

    4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序列,要 ...

  3. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  4. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  5. 「JSOI2014」序列维护

    「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...

  6. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  7. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  8. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  9. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

随机推荐

  1. Linux常见问题汇总

    Linux问题: ifconfig查看IP地下载报错:bash: ifconfig: commandnotfound 解决方法: 先执行 export PATH="$PATH:/sbin&q ...

  2. H5 类选择器

    10-类选择器 错误的写法: --> 迟到毁一生 早退穷三代 按时上下班 必成高富帅 我是段落 我是段落 <!DOCTYPE html> <html lang="en ...

  3. hibernate坑边闲话3

    could not initialize proxy - no Session] with root cause org.hibernate.LazyInitializationException: ...

  4. 01-JavaScript介绍

    JavaScript价绍 1.引言 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) ...

  5. Python_内置函数之round的幺蛾子

    pycharm运行结果 1 ret = round(0.5) print(ret) >>> 0 ret1 = round(1.5) print(ret1) >>> ...

  6. Linux 典型应用之远程连接SSH

    查看版本 cat /etc/redhat-release 如果ifconfig不能使用 yum install net-tools 修改配置 vim /etc/sysconfig/network-sc ...

  7. jmeter环境配置

    Java 8 安装 正常安装,一路默认就好,记住安装路径,配置环境变量时用得到.默认安装路径:C:\Program Files\Java\jdk1.8.0_91. 安装好之后会有两个文件夹一个是jdk ...

  8. MyEclipse 10.X激活方法

    普遍的激活办法请参考: http://blog.csdn.net/miss_kun/article/details/51819206 http://jingyan.baidu.com/article/ ...

  9. Day 4-8 hashlib加密模块

    HASH Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射 ...

  10. v-show 与 v-if区别

    关于条件渲染 所谓条件渲染,就是根据不同的条件,使用不同的模板来生成 html. 在 Vue.js 中,使用 v-if 和 v-show 指令来控制条件渲染. 区别 v-show 会在app初始化的时 ...