Description

维护三个操作:区间加,区间翻转,区间求最大值。\(n \leq 50000\)

Solution

fhqtreap大法好!

模板题(我是不会告诉你这篇题解是用来存个代码的

Code

#include <bits/stdc++.h>
using namespace std;
const int INF = 2147483647;
const int N = 50050;
int n, m;
struct node {
int d, rnd, Mx, add, rev, siz;
node *ch[2];
inline void upd() {
int sizz = 1, MX = d;
if(ch[0]) sizz += ch[0]->siz, MX = max(MX, ch[0]->Mx);
if(ch[1]) sizz += ch[1]->siz, MX = max(MX, ch[1]->Mx);
siz = sizz; Mx = MX;
}
inline void push() {
if(add) {
if(ch[0]) { ch[0]->d += add, ch[0]->Mx += add, ch[0]->add += add; }
if(ch[1]) { ch[1]->d += add, ch[1]->Mx += add, ch[1]->add += add; }
upd(); add = 0;
} if(rev) {
swap(ch[0], ch[1]);
if(ch[0]) ch[0]->rev ^= 1;
if(ch[1]) ch[1]->rev ^= 1;
rev = 0;
}
}
}pool[N], *cur = pool, *root;
inline int siz(node *p) { if(p) return p->siz; return 0; }
inline node *newnode(int d) {
node *ret = cur++;
ret->siz = 1, ret->d = ret->Mx = d,
ret->add = ret->rev = 0; ret->rnd = rand();
ret->ch[0] = ret->ch[1] = 0;
return ret;
}
inline node *merge(node *p, node *q) {
if(!p) return q; if(!q) return p;
if(p->rnd < q->rnd) { p->push(); p->ch[1] = merge(p->ch[1], q); p->upd(); return p; }
if(p->rnd >= q->rnd) { q->push(); q->ch[0] = merge(p, q->ch[0]); q->upd(); return q; }
}
inline void split(node *r, int k, node *&p, node *&q) {
if(!r) { p = q = NULL; return ; } r->push();
if(siz(r->ch[0]) < k) p = r, split(r->ch[1], k - siz(r->ch[0]) - 1, r->ch[1], q);
else q = r, split(r->ch[0], k, p, r->ch[0]); r->upd();
}
int main() {
srand((unsigned long long)new char);
scanf("%d %d", &n, &m); root = newnode(0);
for(int i = 2; i <= n; i++) root = merge(root, newnode(0));
for(int i = 1; i <= m; i++) {
int op, l, r, x; node *p, *q, *s;
scanf("%d %d %d", &op, &l, &r);
split(root, l - 1, p, q);
split(q, r - l + 1, q, s);
if(op == 1) scanf("%d", &x), q->add += x, q->d += x, q->Mx += x;
if(op == 2) q->rev ^= 1;
if(op == 3) printf("%d\n", q->Mx);
root = merge(p, merge(q, s));
}
return 0;
}

题解【bzoj1251 序列终结者】的更多相关文章

  1. [BZOJ1251]序列终结者

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

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

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

  3. [bzoj1251]序列终结者_splay

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

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

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

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

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作: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: 序列终结者 fhqtreap写法

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

随机推荐

  1. C++多态深入分析!

    以下分析是基于VS2010的.以后会使用G++分析看看G++如何处理多态! // polymorphic_test.cpp : 定义控制台应用程序的入口点. // /** 特别注意:实现C++多态,除 ...

  2. Java文件写入时是否覆盖

    这个是和服务器读数据结合着来的,是向服务器文件写数据,这就碰到了是否覆盖以前写的数据的问题,看FileWriter();的参数后面的参数名叫append,用词典查是附加的意思,灵机一动,改成false ...

  3. ASP.NET中实现封装与策略模式

    首先把运算方法封装起来,这样在网页界面中直接就可以调用了,不过是换张脸而已! using System; using System.Collections.Generic; using System. ...

  4. Effective Modern C++翻译(6)-条款5:auto比显示的类型声明要更好

        在概念上说,auto关键字和它看起来一样简单,但是事实上,它要更微妙一些的.使用auto会让你在声明变量时省略掉类型,同时也会防止了手动类型声明带来的正确性和性能上的困扰:虽然按照语言预先定义 ...

  5. Python入门:条件控制

    条件控制其实就是if...else...(如果...条件是成立的,就做...:反之,就做...)的使用,其基本结构是: 具体看下面这个例子: def account_login(): # 定义函数 p ...

  6. C语言以字符形式读写文件

    一.字符读取函数 fgetc (一).函数介绍 fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符.函数原型为: int fgetc(FILE* fp) fp 为文件 ...

  7. [转帖]2018年JVM生态系统报告出炉

    很多未解之谜终于有答案了——2018年JVM生态系统报告出炉 https://blog.csdn.net/hollis_chuang/article/details/84134298   2018年1 ...

  8. MSTSC 修改端口的简单方法 3389

    1. 3389端口太过危险  最简单的办法是 修改默认端口方法非常简单. 2. win+r 打开运行, 输入 regedit 打开 注册表 3. 在地址栏输入 远程的服务的路径 输入的内容为: 计算机 ...

  9. Android Holo Theme的三种表现形式

    摘录自:http://blog.csdn.net/xyz_lmn/article/details/12000941 Holo Theme的三种表现形式 Holo Theme是android4.0开始提 ...

  10. BZOJ3246 IOI2013Dreaming

    如果将森林里每棵树都各自看做一个点,那么最后所连成的树应该是一颗菊花,否则将叶子节点父亲改为根不会更劣. 对于每个点所代表的树,其和根节点相连的点应该是到其他点距离最大值最小的点.这个点显然是直径的中 ...