BZOJ1251——序列终结者
给你一个数列,让你实现区间加上一个值,区间翻转,区间最大值
裸splay,懒标记一发即可
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
Node *ch[2];
int m, v, k, s, f;
inline int cmp(int x){
int o = 0;
if(ch[0] != NULL){
if(ch[0] -> s >= x) return 0;
o += ch[0] -> s;
}
if(o + 1 == x) return -1;
return 1;
}
inline void maintain(){
s = 1;
if(ch[0] != NULL) s += ch[0] -> s;
if(ch[1] != NULL) s += ch[1] -> s;
return;
}
inline void Back(){
m = v;
if(ch[0] != NULL) m = max(m, ch[0] -> m);
if(ch[1] != NULL) m = max(m, ch[1] -> m);
return;
}
inline void pushdown(){
if(f == 1){
if(ch[0] != NULL){
ch[0] -> f ^= 1;
swap(ch[0] -> ch[0], ch[0] -> ch[1]);
}
if(ch[1] != NULL){
ch[1] -> f ^= 1;
swap(ch[1] -> ch[0], ch[1] -> ch[1]);
}
f = 0;
}
if(ch[0] != NULL){
ch[0] -> k += k;
ch[0] -> m += k;
ch[0] -> v += k;
}
if(ch[1] != NULL){
ch[1] -> k += k;
ch[1] -> m += k;
ch[1] -> v += k;
}
k = 0;
return;
}
};
struct splay_tree{
Node ft[1000000];
int size;
Node *p;
int x, y;
inline void init(){
size = 0;
return;
}
inline void rotate(Node* &o, int d){
Node *k = o -> ch[d ^ 1];
k -> pushdown(); //注意这里
o -> ch[d ^ 1] = k -> ch[d];
k -> ch[d] = o;
o -> maintain();
k -> maintain();
o -> Back();
k -> Back();
o = k;
return;
}
inline void splay(Node* &o, int k){
o -> pushdown();
if(o -> ch[0] != NULL) o -> ch[0] -> pushdown();
if(o -> ch[1] != NULL) o -> ch[1] -> pushdown();
int d = o -> cmp(k);
if(d == 1 && o -> ch[0] != NULL) k = k - o -> ch[0] -> s - 1;
else if(d == 1) k --;
if(d != -1){
Node* w = o -> ch[d];
int d2 = w -> cmp(k);
int k2 = k;
if(d2 != 0){
k2 --;
if(w -> ch[0] != NULL) k2 -= w -> ch[0] -> s;
}
if(d2 != -1){
splay(w -> ch[d2], k2);
if(d == d2) rotate(o, d ^ 1);
else rotate(o -> ch[d], d);
}
rotate(o, d ^ 1);
}
if(o -> ch[0] != NULL) o -> ch[0] -> pushdown();
if(o -> ch[1] != NULL) o -> ch[1] -> pushdown();
o -> Back();
return;
}
inline Node* merge(Node *left, Node *right){
if(left == NULL) return right;
if(right == NULL) return left;
splay(left, left -> s);
left -> ch[1] = right;
left -> maintain();
left -> Back();
return left;
}
inline void split(Node* &o, int k, Node* &left, Node* &right){
if(k == 0){
left = NULL;
right = o;
return;
}
splay(o, k);
left = o;
right = o -> ch[1];
left -> ch[1] = NULL;
left -> maintain();
left -> Back();
return;
}
inline void insert(Node* &o, int l, int r){
if(r < l) return;
int mid = (l + r) / 2;
o = &ft[size]; size ++;
o -> ch[0] = o -> ch[1] = NULL;
o -> v = o -> m = o -> f = o -> k = 0;
if(l != r){
insert(o -> ch[0], l, mid - 1);
insert(o -> ch[1], mid + 1, r);
}
o -> maintain();
return;
}
inline void add1(Node* &o, int l, int r, int t){
if(r < l) return;
o -> pushdown();
if(y < l || r < x) return;
if(x <= l && r <= y){
o -> m += t;
o -> v += t;
o -> k += t;
return;
}
int mid = l;
if(o -> ch[0] != NULL) mid += o -> ch[0] -> s;
if(x <= mid && mid <= y) o -> v += t;
if(o -> ch[0] != NULL) add1(o -> ch[0], l, mid - 1, t);
if(o -> ch[1] != NULL) add1(o -> ch[1], mid + 1, r, t);
o -> Back();
return;
}
inline void add2(Node* &o, int l, int r){
Node *left, *mid, *right;
split(p, l - 1, left, mid);
split(mid, r - l + 1, mid, right);
swap(mid -> ch[0], mid -> ch[1]);
mid -> f ^= 1;//注意这里
p = merge(left, merge(mid, right));
return;
}
inline int query(Node* &o, int l, int r){
if(r < l) return -2147483640;
o -> pushdown();
if(y < l || r < x) return -214743640;
if(x <= l && r <= y) return o -> m;
int mid = l;
if(o -> ch[0] != NULL) mid += o -> ch[0] -> s;
int ret = -2147483640;
if(x <= mid && mid <= y) ret = o -> v;
if(o -> ch[0] != NULL) ret = max(ret, query(o -> ch[0], l, mid - 1));
if(o -> ch[1] != NULL) ret = max(ret, query(o -> ch[1], mid + 1, r));
o -> Back();
return ret;
}
} wt;
int main(){
/*freopen("seq1.in", "r", stdin);
freopen("seq.out", "w", stdout);*/
int n, m;
scanf("%d%d", &n, &m);
wt.insert(wt.p, 1, n);
for(int i = 1; i <= m; i ++){
int o;
int a, b, c;
scanf("%d", &o);
if(o == 1){
scanf("%d%d%d", &a, &b, &c);
wt.x = a; wt.y = b;
wt.add1(wt.p, 1, n, c);
}
else if(o == 2){
scanf("%d%d", &a, &b);
wt.add2(wt.p, a, b);
}
else{
scanf("%d%d", &a, &b);
wt.x = a; wt.y = b;
printf("%d\n", wt.query(wt.p, 1, n));
}
}
return 0;
}
BZOJ1251——序列终结者的更多相关文章
- [BZOJ1251]序列终结者
[BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...
- [bzoj1251]序列终结者_splay
序列终结者 bzoj-1251 题目大意:给定一个长度为n的正整数序列,支持区间加,区间反转,查询区间最大值.所有元素开始都是0. 注释:$1\le n\le 5\cdot 10^4$,操作个数不多于 ...
- bzoj1251 序列终结者(Splay Tree+懒惰标记)
Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...
- BZOJ1251序列终结者——非旋转treap
题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- [bzoj1251]序列终结者——splay
题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- BZOJ1251 序列终结者(Splay平衡树)(占位)
网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量…… ...
- bzoj1251 序列终结者(splay)
人生第一发splay,写得巨丑,最后忘记了push_down以后要将子节点maintain 9k代码不忍直视 #define NDEBUG #include<cstdio> #includ ...
- 题解【bzoj1251 序列终结者】
Description 维护三个操作:区间加,区间翻转,区间求最大值.\(n \leq 50000\) Solution fhqtreap大法好! 模板题(我是不会告诉你这篇题解是用来存个代码的 Co ...
- bzoj1251: 序列终结者 fhqtreap写法
fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...
随机推荐
- BZOJ4668: 冷战
并查集,按秩合并,树高log,暴力查询. 果然bzoj新挂的题中过的人多的全是sb题. 写了一发秒WA,发现姿势不对.(@_@) 然后过了50min,开始怀疑人生.(*_*) 这么长时间我lct都写完 ...
- 10月14日上午PHP环境搭建
第一步:安装wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b文件,安装过程中可能会遇到问题,把遇到的问题代码复制粘贴到360人工服务,查找方案 ...
- Linux下Redis服务器安装配置
说明:操作系统:CentOS1.安装编译工具yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel ...
- xutils 3.0 post 使用
github:https://github.com/wyouflf/xUtils3 xUtils3简介 xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传, ...
- ecshop网站搬家缓存无法更新
问题描述: 1.后台产品列表能改,数据也能看到,前端就是不显示 2.缓存无法删除 3.网上其他方法都试过,还是不行 症状:是因为缓存无法删除,无法更新,只需要能重新更新缓存文件即可.网站搬家丢失tem ...
- linq多表join与group
var query =from a in this.ObjectContext.siteInfo join b in this.ObjectContext.shopInfo on a.siteID e ...
- jQuery/js 正则收集(邮件验证、)
var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; //验证邮箱的正则表达式if( ...
- WKWebView使用及注意点
iOS8之后,苹果推出了WebKit这个框架,用来替换原有的UIWebView,新的控件优点多多,不一一叙述.由于一直在适配iOS7,就没有去替换,现在仍掉了iOS7,以为很简单的就替换过来了,然而在 ...
- vim的寄存器和剪贴簿操作?
vim 复制/ 删除 多行? 有确定序号的行: :10,15m20, 10,15co20 没有确定序号的行: ndd, nyy. 其中的n表示, 从当前行开始算起(当前行本身要包含!!!), 向下共删 ...
- PHP 5.5 新特性
文章转自:http://wulijun.github.io/2013/07/17/whats-new-in-php-5-5.html http://www.cnblogs.com/yjf512/p/3 ...