模板题 link

Splay 区间翻转,存个代码

旋转时,要注意goal是引用 , 并记得修改 , 有标记的一定记得标记下放 , 还有清空

#include<iostream>
#include<cstdio>
using namespace std;
const int N = 101000;
inline int read()
{
register int x = 0 , f = 0; register char c = getchar();
while(c < '0' || c > '9') f |= c == '-' , c = getchar();
while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0' , c = getchar();
return f ? -x : x;
}
#define RQ puts("RQ");
int n , m , sz , root;
int tr[N][2] , val[N] , rev[N] , fa[N] , siz[N];
inline int Newnode() { return ++sz; }
inline void update(int x) { siz[x] = siz[tr[x][0]] + siz[tr[x][1]] + 1; }
inline int witch(int x) { return x == tr[fa[x]][1]; }
inline int rk(int x) { return 1 + siz[tr[x][0]]; }
void rot(int x , int &goal) // 忘记了修改 goal
{
int y = fa[x] , z = fa[y] , k = witch(x) , w = tr[x][!k];
if(y == goal) goal = x; else tr[z][witch(y)] = x;
fa[x] = z; tr[y][k] = w; if(w) fa[w] = y;
tr[x][!k] = y; fa[y] = x;
update(y); update(x);
} void down(int x)
{
if(!x || !rev[x]) return ; // 没用判断标记
swap(tr[x][0] , tr[x][1]);
if(tr[x][0]) rev[tr[x][0]] ^= 1;
if(tr[x][1]) rev[tr[x][1]] ^= 1;
rev[x] = 0; // 还没有清空
return ;
} void Splay(int x , int &goal) // 引用
{
while(x != goal)
{
if(fa[x] != goal) rot(witch(x) == witch(fa[x]) ? fa[x] : x , goal);
rot(x , goal);
}
return ;
} void build(int &k , int l , int r , int f)
{
if(l > r) return ; int mid = (l + r) >> 1;
if(!k) k = Newnode(); siz[k] = 1; fa[k] = f; val[k] = mid;
build(tr[k][0] , l , mid - 1 , k);
build(tr[k][1] , mid + 1 , r , k);
update(k); return ;
} int kth(int k) // 求的是第k大的是谁 , 而不是k的排名
{
int p = root;
while(down(p) , rk(p) != k)
{
if(rk(p) < k) k -= rk(p) , p = tr[p][1];
else p = tr[p][0];
}
Splay(p , root);
return p;
} void reverse(int l , int r)
{
int x = kth(l) , y = kth(r);
Splay(x , root); Splay(y , tr[x][1]);
rev[tr[y][0]] ^= 1; return ;
} void dfs(int x)
{
if(!x) return ; down(x);
dfs(tr[x][0]);
if(val[x] >= 1 && val[x] <= n) printf("%d " , val[x]);
dfs(tr[x][1]);
return ;
} int main()
{
n = read(); m = read();
build(root , 0 , n+1 , 0);
for(int i = 1 ; i <= m ; ++i)
{
int l = read() , r = read();
reverse(l , r + 2);
}
dfs(root);
return 0;
}

P3391 【模板】文艺平衡树的更多相关文章

  1. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  2. 洛谷.3391.[模板]文艺平衡树(Splay)

    题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...

  3. 【洛谷P3391】文艺平衡树——Splay学习笔记(二)

    题目链接 Splay基础操作 \(Splay\)上的区间翻转 首先,这里的\(Splay\)维护的是一个序列的顺序,每个结点即为序列中的一个数,序列的顺序即为\(Splay\)的中序遍历 那么如何实现 ...

  4. 洛谷 P3391 【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  5. P3391 【模板】文艺平衡树FHQ treap

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  6. P3391 【模板】文艺平衡树(Splay)新板子

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  7. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

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

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

  9. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

  10. 洛谷 P3391【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

随机推荐

  1. python随用随学20200221-生成器中的send(),throw()和close()方法

    send()方法 文档定义 generator.send(value) Resumes the execution and "sends" a value into the gen ...

  2. 使用vscode阅读C代码outline不显示问题

    1 问题:使用vscode code 阅读C代码 outline 显示No symbols found in document 'xxxx' 2 参考网上解决方法,进行如下操作 2.1  安装C/C+ ...

  3. qt creator源码全方面分析(2-9)

    目录 Semantic Highlighting 通用高亮 高亮和折叠块 Semantic Highlighting Qt Creator将C++,QML和JavaScript语言理解为代码,而不是纯 ...

  4. clr via c# 程序集

    1,程序集的种类 强命名程序集 使用了公钥进行签名 可以应用CLR的安全策略.---可以全局部署---可以部署到一些公认位置. 弱命名程序集 只能私有部署----部署到应用程序基目录或其子目录中 2, ...

  5. matlab仿真随机数的产生

    概率论和数理统计实验(matlab中实现) 一.伯努利分布 R=binornd(N,P); //N,P为二次分布的俩个参数,返回服从参数为N,P的二项分布的随机数,且N,P,R的形式相同. R=bin ...

  6. CSS3之border-image的使用

    最近,我在项目开发中遇到这样的问题. 要给这个tab的底部的蓝线左右加上圆角. 然而,这个元素实际如上图所示,只是active的时候加了个underline的类,蓝线并没有单独的html. 若给这个s ...

  7. codeforceCodeForces - 1107G

    单调栈 RMQ #include<iostream> #include<cstdio> #include<cmath> #include<cstring> ...

  8. Mac下安装MySQL8的问题

    黑苹果用了一段时间之后,发现很多方面用起来比Windows还舒服些,没什么具体指标,就是纯粹一种感觉. 所以,慢慢将很多程序都迁移过来,在迁移过程中发现的一些有意思的事儿,我都把他们记录下来.如果,不 ...

  9. web渗透漏洞靶场收集

    最近将自己遇到过或者知道的web靶场链接奉上 0X01 DVWA 推荐新手首选靶场,配置简单,需下载phpstudy和靶场文件包,简单部署之后即可访问. 包含了常见的web漏洞(php的),每个漏洞分 ...

  10. HDU5608

    题意 英文 做法 设\(g(n)=n^2-3n+2\),有\(g(n)=\sum\limits_{d|n}f(d)\),反演一下有\(f(n)=\sum\limits_{d|n}\mu(\frac{n ...