如题,这是一个模板。。。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype> #define max(x, y) (x > y ? x : y)
#define min(x, y) (x < y ? x : y) inline void read(int & x)
{
x = ;
int k = ;
char c = getchar();
while (!isdigit(c))
if (c == '-') c = getchar(), k = -;
else c = getchar();
while (isdigit(c))
x = (x << ) + (x << ) + (c ^ ),
c = getchar();
x *= k;
} const int inf = ;
const int N = ;
int n, m, tot, l, r, x, y, z, opt, mxa = -;
int cnt[N], faz[N], val[N], siz[N], a[N], son[N][], root[N]; //=======================================================================
//Splay inline int Getson(int u) { return son[faz[u]][] == u; } inline void Pushup(int u) { siz[u] = siz[son[u][]] + siz[son[u][]] + cnt[u]; } inline int Getmin(int u) { while (son[u][]) u = son[u][]; return u; } inline int Getmax(int u) { while (son[u][]) u = son[u][]; return u; } inline int Getx(int rtid, int x)
{
int u = root[rtid], las = ;
while (u && val[las = u] != x)
if (x >= val[u]) u = son[u][];
else u = son[u][];
return u ? u : las;
} void Rotate(int u)
{
int y = faz[u], z = faz[y], ch = Getson(u);
int b = son[u][ch ^ ], d = Getson(y);
son[u][ch ^ ] = y, son[y][ch] = b;
faz[y] = u, faz[b] = y, faz[u] = z;
if (z) son[z][d] = u;
Pushup(y), Pushup(u);
} void Splay(int rtid, int u, int tar)
{
while (faz[u] != tar)
{
if (faz[faz[u]] != tar)
if (Getson(u) == Getson(faz[u])) Rotate(faz[u]);
else Rotate(u);
Rotate(u);
}
if (!tar) root[rtid] = u;
} inline void Insert(int rtid, int x)
{
int u = root[rtid], las = ;
if (!root[rtid])
{
root[rtid] = u = ++tot;
val[u] = x; siz[u] = cnt[u] = ;
faz[u] = son[u][] = son[u][] = ;
return;
}
while (true)
{
++siz[u];
if (x == val[u])
{
++cnt[u];
break;
}
las = u;
if (x > val[u]) u = son[u][];
else u = son[u][];
if (!u)
{
u = ++tot, val[u] = x, faz[u] = las,
son[las][x > val[las]] = u;
son[u][] = son[u][] = ,
siz[u] = cnt[u] = ;
break;
}
}
Splay(rtid, u, );
} inline void Delete(int rtid, int x)
{
int u = root[rtid];
while (u)
if (x == val[u])
{
Splay(rtid, u, );
if (cnt[u] > ) { --cnt[u], --siz[u]; return; }
if (!son[u][] || !son[u][])
{
root[rtid] = son[u][] | son[u][];
faz[root[rtid]] = ;
return;
}
int newrt = Getmin(son[u][]);
faz[son[u][]] = ,
faz[son[u][]] = newrt,
son[newrt][] = son[u][];
Splay(rtid, newrt, );
return;
}
else if (x > val[u]) u = son[u][];
else u = son[u][];
} inline int Getkth(int rtid, int k)
{
int u = root[rtid];
if (siz[u] < k) return -inf;
while (u)
if (siz[son[u][]] >= k) u = son[u][];
else if (siz[son[u][]] + cnt[u] < k) k -= siz[son[u][]] + cnt[u], u = son[u][];
else return val[u];
} inline int Getrank(int rtid, int x)
{
//-------------------·½·¨Ò»------------------------
//Wrong Answer
/* int u = Getx(rtid, x);
Splay(rtid, u, 0);
return siz[son[u][0]];
*/ //-------------------·½·¨¶þ------------------------
int sum = , u = root[rtid];
while (u)
if (x == val[u]) return sum + siz[son[u][]];
else if (x > val[u]) sum += siz[son[u][]] + cnt[u], u = son[u][];
else u = son[u][];
return sum;
} int Pre(int rtid, int x)
{
int u = Getx(rtid, x);
if (val[u] < x) return val[u];
Splay(rtid, u, );
return son[u][] == ? -inf : val[Getmax(son[u][])];
} int Suf(int rtid, int x)
{
int u = Getx(rtid, x);
if (val[u] > x) return val[u];
Splay(rtid, u, );
return son[u][] == ? inf : val[Getmin(son[u][])];
} //Splay End
//=======================================================================
//Segment tree Begin #define Root 1, 1, n
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid (l + r >> 1)
#define MID (L + R >> 1) inline void Segins(int u, int l, int r, int p, int x)
{
Insert(u, x);
if (l == r) return;
if (p <= mid) Segins(Lson, p, x);
else Segins(Rson, p, x);
} inline void Segmdf(int u, int l, int r, int p, int x)
{
Delete(u, a[p]), Insert(u, x);
if (l == r) { a[p] = x; return; }
if (p <= mid) Segmdf(Lson, p, x);
else Segmdf(Rson, p, x);
} inline int Segrak(int u, int l, int r, int x, int y, int z)
{
if (l == x && r == y) return Getrank(u, z);
if (y <= mid) return Segrak(Lson, x, y, z);
if (x > mid) return Segrak(Rson, x, y, z);
return Segrak(Lson, x, mid, z) + Segrak(Rson, mid + , y, z);
} inline int Segpre(int u, int l, int r, int x, int y, int z)
{
if (l == x && r == y) return Pre(u, z);
if (y <= mid) return Segpre(Lson, x, y, z);
if (x > mid) return Segpre(Rson, x, y, z);
return max(Segpre(Lson, x, mid, z), Segpre(Rson, mid + , y, z));
} inline int Segsuf(int u, int l, int r, int x, int y, int z)
{
if (l == x && r == y) return Suf(u, z);
if (y <= mid) return Segsuf(Lson, x, y, z);
if (x > mid) return Segsuf(Rson, x, y, z);
return min(Segsuf(Lson, x, mid, z), Segsuf(Rson, mid + , y, z));
} inline int Segkth(int l, int r, int k)
{
int cur, L = , R = mxa + ;
while (L < R)
{
cur = Segrak(Root, l, r, MID);
if (cur < k) L = MID + ;
else R = MID;
}
return L - ;
} signed main()
{
read(n), read(m);
for (int i = ; i <= n; ++i)
{
read(a[i]);
Segins(Root, i, a[i]);
mxa = max(mxa, a[i]);
}
for (int i = ; i <= m; ++i)
{
read(opt);
if (opt == ) read(x), read(y), Segmdf(Root, x, y);
else
{
read(l), read(r), read(x);
if (opt == ) printf("%d\n", Segrak(Root, l, r, x) + );
if (opt == ) printf("%d\n", Segkth(l, r, x));
if (opt == ) printf("%d\n", Segpre(Root, l, r, x));
if (opt == ) printf("%d\n", Segsuf(Root, l, r, x));
}
}
return ;
}

【模板】树套树(线段树套Splay)的更多相关文章

  1. P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)

    P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...

  2. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  3. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  4. BZOJ 3218(a + b Problem-二分图套值域线段树)

    出这题的人是怎么想出来的…… 言归正传,这题是二分图套值域线段树. 首先经过 @Vfleaking的神奇建图后,把图拆成二分图, 不妨利用有向图最小割的性质建图(以前我一直以为最小割和边的方向无关,可 ...

  5. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

  6. LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化

    题目:[模板]可持久化线段树 1(主席树) 不知道说啥. #include<cstdio> #include<cstring> #include<iostream> ...

  7. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  8. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. POJ 2104 K-th Number && 洛谷 P3834 【模板】可持久化线段树 1(主席树)

    我惊奇的发现这两道题一模一样 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询 ...

  10. luogu3834 【模板】可持久化线段树1(主席树)

    关键字:线段树 可持久化 线段树:当版本(即对应的原序列的区间[1,r])一定时,每个节点的left,right下标为值域,值为其对应的原序列区间[1,r]中元素大小在值域中的元素个数. 可持久化:新 ...

随机推荐

  1. Docker学习:virtualbox安装和配置

    下载.安装 从官网:https://www.virtualbox.org/下载,根据说明直接一步步安装即可 安装ubuntu 说明:这里本机内存是16G,若内存<4G安装完成虚拟机, 安装完成之 ...

  2. Leetcode:根据身高重建队列

    题目 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于11 ...

  3. UVa 11168(凸包、直线一般式)

    要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式\(\frac{|A* \sum{x}+B* \sum{y}+C*n|}{\sqr ...

  4. Java EE学习笔记(十)

    MyBatis与Spring的整合 1.整合环境搭建 1).要实现MyBatis与Spring的整合,很明显需要这两个框架的JAR包,但是只使用这两个框架中所提供的JAR包是不够的,还需要其他的JAR ...

  5. HttpServletRequest 和 HttpServletResponse

    Servlet配置方式 全路径匹配 以 / 开始 /a /aa/bb localhost:8080/项目名称/aa/bb 路径匹配 , 前半段匹配 以 / 开始 , 但是以 * 结束 /a/* /* ...

  6. Linux Maven install

    1 下载 maven : http://maven.apache.org/download.cgi2 解压 tar -xvf apache-maven-3.3.9-bin.tar.gz3 移到所需目录 ...

  7. Zepto事件模块源码分析

    Zepto事件模块源码分析 一.保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数.而Zepto则可以不传入回调函数,直接移除对应类型的所有事件.原因就在于Z ...

  8. 3D旋转仿伪3D立体效果,手机端

    偶然在书上看到这段代码,感觉很舒服,直街附代码吧,原生JS.手机端旋转效果仿立体效果. 纯JS代码足够了. var img=document.createElement('img'); img.set ...

  9. webpack.config.js====CSS相关:css和scss配置loader

    1. 安装: //loader加载器加载css和sass模块 cnpm install style-loader css-loader node-sass sass-loader --save-dev ...

  10. <Android 应用 之路> 天气预报(二)

    界面组成 载入界面 显示界面 Activity两个,一个用来显示载入界面,一个用来显示天气信息 主要代码如下: public class MyActivity extends Activity { p ...