#define _CRT_SECURE_NO_WARNINGS
#include<cmath>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<string.h>
using namespace std;
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
#define ls(n) node[n].ch[0]
#define rs(n) node[n].ch[1]
const int N = ;
const int INF = 0x3f3f3f3f; struct Splay {
struct Node {
int fa, ch[];
bool flip;
int v, add, maxn, s;
void init(int val)
{
v = maxn = val;
s = ;
add = flip = ch[] = ch[] = ;
}
}node[N];
int root;
//维护一个结点
void pushup(int n)
{
node[n].maxn = max(node[n].v, max(node[ls(n)].maxn, node[rs(n)].maxn));
node[n].s = node[ls(n)].s + node[rs(n)].s + ;
}
//标记向下传
void pushdown(int n)
{
if (n == ) return;
if (node[n].add) {
if (ls(n)) {
node[ls(n)].v += node[n].add;
node[ls(n)].maxn += node[n].add;
node[ls(n)].add += node[n].add;
}
if (rs(n)) {
node[rs(n)].v += node[n].add;
node[rs(n)].maxn += node[n].add;
node[rs(n)].add += node[n].add;
}
node[n].add = ;
}
if (node[n].flip) {
if (ls(n)) node[ls(n)].flip ^= ;
if (rs(n)) node[rs(n)].flip ^= ;
swap(ls(n), rs(n));
node[n].flip = ;
}
}
//旋转
void rotate(int n, int d)
{
int fn = node[n].fa;
int ffn = node[fn].fa;
node[fn].ch[d ^ ] = node[n].ch[d];
node[node[n].ch[d]].fa = fn; node[n].ch[d] = fn;
node[fn].fa = n; node[ffn].ch[rs(ffn) == fn] = n;
node[n].fa = ffn;
pushup(fn);
}
//将结点n转到goal下
void splay(int n, int goal)
{
while (node[n].fa != goal)
{
int fn = node[n].fa;
int ffn = node[fn].fa;
pushdown(ffn), pushdown(fn), pushdown(n);
bool d = (ls(fn) == n);
bool d1 = (ls(ffn) == fn);
if (ffn == goal) rotate(n, d);
else
{
if (d == d1) rotate(fn, d1); else rotate(n, d);
rotate(n, d1);
}
}
pushup(n);
if (goal == ) root = n;
}
//找寻中序遍历中的第pos个结点
int select(int pos)
{
int u = root;
pushdown(u);
while (node[ls(u)].s != pos)
{
if (pos < node[ls(u)].s) u = ls(u);
else
{
pos -= node[ls(u)].s + ;
u = rs(u);
}
pushdown(u);
}
return u;
}
//查询l~r最大值
int query(int l, int r)
{
int u = select(l - ), v = select(r + );
splay(u, ); splay(v, u);
return node[ls(v)].maxn;
}
//给l~r加上val
void update(int l, int r, int val)
{
int u = select(l - ), v = select(r + );
splay(u, ); splay(v, u);
node[ls(v)].v += val;
node[ls(v)].maxn += val;
node[ls(v)].add += val;
}
//翻转l~r
void reverse(int l, int r)
{
int u = select(l - ), v = select(r + );
splay(u, ); splay(v, u);
node[ls(v)].flip ^= ;
}
//类似二分来建树,就是这段代码现在的我还不会用指针来替换
int build(int l, int r)
{
if (l > r) return ;
if (l == r) return l;
int mid = (l + r) >> ;
int L, R;
ls(mid) = L = build(l, mid - );
rs(mid) = R = build(mid + , r);
node[L].fa = node[R].fa = mid;
pushup(mid);
return mid;
}
//初始化
void init(int n)
{
node[].init(-INF); node[].s = ;
node[].init(-INF);
node[n + ].init(-INF);
for (int i = ; i <= n + ; i++)
node[i].init();
root = build(, n + );
node[root].fa = node[].fa = ;
ls() = root;
}
}splay_tree; int main()
{
int n, m;
scanf("%d%d", &n, &m);
splay_tree.init(n);
for (int i = ; i < m; i++)
{
int opt, l, r, v;
scanf("%d%d%d", &opt, &l, &r);
if (opt == ) { scanf("%d", &v); splay_tree.update(l, r, v); }
if (opt == ) splay_tree.reverse(l, r);
if (opt == ) printf("%d\n", splay_tree.query(l, r));
}
return ;
}
/*
const int maxn = 55;
const int inf = 1e9 + 5;
ll n,m;
struct splay_tree {
struct node {
int val, mx, add, sz, son[2];
bool rev;
void init(int _val) { val = mx = _val, sz = 1, add = rev = son[0] = son[1]; }
}T[maxn];
int fa[maxn], root; void Rotate(int x, int kind) {
int y = fa[x], z = fa[y];
T[y].son[!kind] = T[x].son[kind], fa[T[x].son[kind]] = y;
T[x].son[kind] = y, fa[y] = x;
T[z].son[T[z].son[1] == y] = x, fa[x] = z;//orz
}
void Splay(int x,)
};
string s[maxn];
map<char, int> mmp; int main()
{
cin >> n >> m;
hehe.init();
for (int i = 0, a, b, c, d; i < m; i++) {
scanf("%d", &a);
if (a == 1) { scanf("%d%d%d", &b, &c, &d); hehe.update(b, c, d); }
else if (a == 2) { scanf("%d%d", &b, &c); hehe.Reverse(b, c); }
else { scanf("%d%d", &b, &c); printf("%d\n"); hehe.query(b, c); }
} return 0;
}*/

【待补】splay 模板的更多相关文章

  1. bzoj 1588 splay模板题

    用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...

  2. COJ 1002 WZJ的数据结构(二)(splay模板)

    我的LCC,LCT,Splay格式终于统一起来了... 另外..这个形式的Splay是标准的Splay(怎么鉴别呢?看Splay函数是否只传了一个变量node就行),刘汝佳小白书的Splay写的真是不 ...

  3. Splay 模板

    Splay 模板 struct SplayTree{ const static int maxn = 1e5 + 15; int ch[maxn][2] , key[maxn] , s[maxn] , ...

  4. [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)

    解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...

  5. BZOJ1588 [HNOI2002]营业额统计 splay模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][S ...

  6. 文艺平衡树(splay模板)

    题干:splay模板,要求维护区间反转. splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树. 但是有两个坏处: 1.splay常数远远大于trea ...

  7. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  8. bzoj 1208 splay模板题2

    自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...

  9. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

随机推荐

  1. [AaronYang]那天有个小孩跟我说Js-NodeJS[AY0]-EJS

    按照自己的思路学习Node.Js 随心出发.EJS是Node.js中express框架中使用的一个模版引擎,当然还有Jade 我的学习就靠网上查资料,没有买书系统学,自己整理,如果有用了哪位大神的代码 ...

  2. Javascript 原生Cookie使用用法

    var oCookie = { setCookie: function (name, value, expireDays, path, domain) { var expireDays = expir ...

  3. 11G新特性 -- flashback data archive(2)

    创建Flashback Data Archive用户需要授予dba或flashback archive administer系统特权.flashback archive administer系统特权包 ...

  4. Java Web开发基础零星知识

    1. Web的三个核心标准 万维网的核心标准有三个,分别是URL.HTTP和HTML. URL(统一资源定位符,Universal Resource Locator),为描述Internet上的网页以 ...

  5. IOS 简单的 加减分 动画

    使用 shapeLayer 当动画层  其实以前有写过 类似的了 github: https://github.com/li6185377/AddScore self.pregress = [[CAS ...

  6. 物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息

    1. 前言 按照我自己设计的物联网框架,对于MQTT集群中的所有消息,是要持久化到磁盘的,这里采用一个消息队列中间件Kafka作为数据缓冲,缓冲结果存到数据仓库中,以供后续作为数据分析.由于MQTT集 ...

  7. C# 创建 读取 更新 XML文件

    public static class XmlHelper { /// <summary> /// 读取节点值 /// </summary> /// <param nam ...

  8. json-server 详解

    JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源. 安装json-server npm install -g json ...

  9. MyBatis源码分析-基础支持层反射模块Reflector/ReflectorFactory

    本文主要介绍MyBatis的反射模块是如何实现的. MyBatis 反射的核心类Reflector,下面我先说明它的构造函数和成员变量.具体方法下面详解. org.apache.ibatis.refl ...

  10. 【iCore4 双核心板_ARM】例程十七:USB_MSC实验——读/写U盘(大容量存储器)

    实验方法: 1.将跳线冒跳至USB_UART,通过Micro USB 线将iCore4 USB-UART接口与电脑相连. 2.打开PUTTY软件. 3.通过读U盘转接线将U盘(或者读卡器)与iCore ...