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> ...
随机推荐
- centos7 + VMware Workstation Pro
centos7 + VMware Workstation Pro安装 centos 7 镜像文件 下载地址https://www.centos.org/download/ 笔者是使用的DVD ISO, ...
- 淘淘商城基于maven和svn的理解
首先了解下maven和svn是什么: Maven是一个项目的管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目的生命周期(Project Life ...
- JavaScript学习笔记——事件
javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为(怎么发生的) 2.事件源 引发事件的元素.(发生在谁的身上)3.事件处理程序 ...
- 安装php时的配置选项
./configure --prefix=/home/samba/anthony/web --enable-mbstring --enable-fastcgi --enable-fpm --with- ...
- 图片延迟加载jquery插件imgLazyLoading
实现了图片延迟加载功能,插件代码非常简洁,且每个功能都把注释写得非常详细,适合网友们学习,好好利用哦 引入图片延迟加载Jquery插件文件后,页面使用代码如下: <script type=&qu ...
- ecshop 调用收货地址
html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...
- Quagga服务器安装和配置
使用本地源 一.安装软件包 # yum install quagga-0.99.15-7.el6_3.2.x86_64.rpm 或rpm # ls /etc/quagga/ bgpd.conf.s ...
- ReSharper 配置及用法(转)
1:安装后,Resharper会用他自己的英文智能提示,替换掉 vs2010的智能提示,所以我们要换回到vs2010的智能提示 2:快捷键.是使用vs2010的快捷键还是使用 Resharper的快捷 ...
- LevelDB库简介
LevelDB库简介 一.LevelDB入门 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询 ...
- cookie和session的对比
1.存放的位置 cookie存在客户端的临时文件夹 session:存在服务器的内存中,一个session域对象为一个用户浏览器服务. 2.安全性 cookie是以明文方式存放在客 ...