#include<bits/stdc++.h>
using namespace std;
#define maxn 200000
int read()
{
char ch=getchar();int f=,w=;
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch<=''&&ch>=''){w=w*+ch-'';ch=getchar();}
return f*w;
} int n,root,m,tot; struct sj
{
int ch[]; //左儿子和右儿子
int ff,v; //ff是父亲 v
int size; //size是儿子节点个数
int mark; //打上的标记
void init(int x,int fa) //初始化一个节点 左儿子和右儿子以及父亲都清零
{
ff=ch[]=ch[]=;
size=;v=x;ff=fa; //含有子节点个数为1 父亲节点为参数fa
}
}t[maxn]; inline void pushup(int x)
{
t[x].size=t[t[x].ch[]].size+t[t[x].ch[]].size+;
} inline void pushdown(int x)
{
if(t[x].mark)
{
t[t[x].ch[]].mark^=;
t[t[x].ch[]].mark^=;
t[x].mark=;
swap(t[x].ch[],t[x].ch[]);
}
} inline void rotate(int x) //旋转函数
{
int y=t[x].ff;
int z=t[y].ff; //这是爷爷节点
int k=t[y].ch[]==x; //看x是左儿子还是右儿子 k取0,1
t[z].ch[t[z].ch[]==y]=x; //这是把爷爷节点的左/右儿子变成x
t[x].ff=z;
t[y].ch[k]=t[x].ch[k^];
t[t[x].ch[k^]].ff=y;
t[x].ch[k^]=y;
t[y].ff=x; //此段画图理解
pushup(y);pushup(x); //再继续进行修改 push_up();
} inline void splay(int x,int goal)
{
while(t[x].ff!=goal) //当我的这个节点还没有达到目标位置
{
int y=t[x].ff;int z=t[y].ff;
if(z!=goal) //如果还没有跳到目标节点 继续旋转
(t[z].ch[]==y)^(t[y].ch[]==x)?rotate(x):rotate(y); //Warning:: !!!!同边现象时要先翻爸爸再翻儿子 否则不满足搜索树的性质!!!!
rotate(x);
}
if(goal==)root=x; //如果目标节点是0 那么就把root 根节点变成x
} inline void insert(int x)
{
int u=root,ff=; //从根节点开始插入 一开始父亲变成0
while(t[u].size!=)ff=u,u=t[u].ch[x>t[u].v]; //有根的时候 ff父亲变成根节点 u再继续下去向下操作
u=++tot; //tot是实时增加的一个记录子节点个数的全局变量
if(ff)t[ff].ch[x>t[ff].v]=u; //如果父亲不为零 他的父亲的左/右儿子就是u
t[u].init(x,ff); //初始化这个节点 并且它的父亲就是ff
splay(u,); //把这个点旋转到根节点
} inline int get_k(int k)
{
int u=root;
while()
{
pushdown(u);
if(t[t[u].ch[]].size>=k)u=t[u].ch[];
else if(t[t[u].ch[]].size+==k)return u;
else k-=t[t[u].ch[]].size+,u=t[u].ch[];
}
} void write(int u)
{
pushdown(u); //最后输出之前先push_down一遍
if(t[u].ch[])write(t[u].ch[]); //先读左儿子
if(t[u].v>&&t[u].v<n+)printf("%d ",t[u].v-);
if(t[u].ch[])write(t[u].ch[]);
} inline void work(int l,int r) //工作函数
{
l=get_k(l);
r=get_k(r+);
splay(l,);
splay(r,l);
t[t[t[root].ch[]].ch[]].mark^=;
} int main()
{
n=read();m=read(); //n个点 m次翻转
for(int i=;i<=n+;++i)insert(i); //跳过建树 直接插入即可 再继续看insert()
for(int i=;i<=m;i++)
{
int l=read(),r=read();
work(l,r); //工作函数
}
write(root); //输出;
return ; //大工告吉
}

洛谷 P3391 模板Splay的更多相关文章

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

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

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

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

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

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

  4. 洛谷P3391文艺平衡树(Splay)

    题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...

  5. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  6. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  7. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  8. BZOJ3223/洛谷P3391 - 文艺平衡树

    BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...

  9. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

随机推荐

  1. docker单主机网络

    当你安装Docker时,它会自动创建三个网络.你可以使用以下docker network ls命令列出这些网络: [root@localhost ~]# docker network ls NETWO ...

  2. React支持装饰器

    在用mobx时用到了装饰器,无奈环境不支持装饰器,搜索了半天,网上教程乱七八糟,最后想到了babel官网上肯定有,一搜果然有,安装教程 见Babel官网. 最快捷的教程是官网文档

  3. Boo who-freecodecamp算法题目

    Boo who 1.要求 检查一个值是否是基本布尔类型,并返回 true 或 false. 基本布尔类型即 true 和 false 2.思路 利用switch语句判断输入的数据是true/false ...

  4. 洛谷 P1516 青蛙的约会

    https://www.luogu.org/problemnew/show/P1516#sub 题意还是非常好理解的..... 假如这不是一道环形的跑道而是一条直线,你会怎样做呢? 如果是我就会列一个 ...

  5. NOIP模拟赛 混合图

    [题目描述] Hzwer神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. Hzwer的国家有n个点,m条边,而作为国王,他十分喜欢游览自己的国家.他一般会从任意一个点出发,随便找边走,沿途欣赏 ...

  6. JS - Array.prototype.sort(compare)

    function compare(a, b) { return -1; // a 在 b 前面 return 1; // a 在 b 后面 return 0; // 并列排序,保持在源数组中的先后顺序 ...

  7. 共享服务-FTP基础(二)

    续接上一篇 使用pam(Pluggable Authentication Modules)完成用户认证 pam_service_name=vsftpd pam配置文件:/etc/pam.d/vsftp ...

  8. nginx站点目录及文件URL访问控制

    一.根据扩展名限制程序和文件访问 利用nginx配置禁止访问上传资源目录下的PHP.Shell.Perl.Python程序文件. 配置nginx,禁止解析指定目录下的指定程序. location ~ ...

  9. phpstorm 工具使用技巧(持续补充中。。。)

    phpstorm 工具使用技巧(持续补充中...) 一.phpstorm大小写切换 1.选择要转换的目标字符串: //普通商家,普通折扣默认值'COMMON_DISCOUNT'=>10.00, ...

  10. 安装ipython的情况总结

    在知乎上看待一位朋友的Python的学习记录,准备跟着学一下.这位朋友用了ipython(因为他主要做科学计算,我自己将来要学习数据科学,感觉很合适),酒准备安装一下ipython,没想到出了不少问题 ...