[luogu P3391] 文艺平衡树
[luogu P3391] 文艺平衡树
题目背景
这是一道经典的Splay模板题——文艺平衡树。
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
输入输出格式
输入格式:
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数
接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n1≤l≤r≤n
输出格式:
输出一行n个数字,表示原始序列经过m次变换后的结果。
输入输出样例
说明
n,m≤100000
上次就很想写了,splay的妙用。
splay能做到一般的平衡树做不到的东西——维护序列。
为什么一般的平衡树做不到?正是因为splaytree的核心操作——splay。
这个log级别的操作能将一个连续的子序列搞到一棵子树中。
比如要维护[l,r],则调用一下splay(find(l-1),0),splay(find(r+1),root)。
但是要注意一下,对于这题,我们需要一个节点在当前序列的排名和初始位置(即权值)。
一个节点的排名是它的左子树大小+1,初始位置是不变的。
对于这题,还有一个巧妙的地方,就是reverse操作。
这里用到了和线段树类似的lazy打标记,延迟下传的思想。还是很厉害的。
输出的话,根据二叉搜索树的性质,直接中序遍历。
code:
#include <cstdio> #include <iostream> void OJ_file() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif } namespace fastIO { #define puc(c) putchar(c) inline int read() { ,f=; char ch=getchar(); ') { if (ch=='-') f=-f; ch=getchar(); } ') { x=(x<<)+(x<<)+ch-'; ch=getchar(); } return x*f; } ]; template <class T> inline void write(T x) { ) { puc('); return; } ) x=-x,puc('-'); ; x; x/=) w[++cnt]=x%; ); } inline void newblank() { puc(' '); } } using namespace fastIO; int n,m; #define SplayTree node struct SplayTree { int v,k; bool r; node* c[]; node () { v=k=r=; c[]=c[]=c[]=; } }*ro; void newnode (node* &x,int k) { x=,x->k=k; } void refresh (node* x) { x->v=; ]) x->v+=x->c[]->v; ]) x->v+=x->c[]->v; } void transfer (node* x) { if (x->r) { ]) x->c[]->r^=; ]) x->c[]->r^=; x->r=,std::swap(x->c[],x->c[]); } } #define M ((l)+(r)>>1) void setup (node* &x,int l,int r) { if (l>r) return; newnode(x,M); setup(x->c[],l,M-),setup(x->c[],M+,r); ]) x->c[]->c[]=x; ]) x->c[]->c[]=x; refresh(x); } bool dir (node* x) { ]) ; ]->c[]==x; } void linknode (node* y,node* x,bool p) { ]=y; if (y) y->c[p]=x; } void rotate (node* x) { ]; linknode(y->c[],x,dir(y)); linknode(y,x->c[p^],p); linknode(x,y,p^); refresh(y),refresh(x); } void splay (node* x,node* an) { ]==an) return; ]!=an) { ]->c[]==an) { rotate(x); if (!an) ro=x; return; } rotate(dir(x)^dir(x->c[])?x:x->c[]); rotate(x); } if (!an) ro=x; } node* find (node* x,int v) { transfer(x); ]?x->c[]->v:; if (v==s) return x; ) ],v); ],v-s-); } void reverse (int l,int r) { node* q[]={find(ro,l-),find(ro,r+)}; splay(q[],),splay(q[],ro); ro->c[]->c[]->r^=; } void dfs (node* x) { transfer(x); ]) dfs(x->c[]); &&x->k<=n) { write(x->k),newblank(); } ]) dfs(x->c[]); } int main() { OJ_file(); n=read(),m=read(),ro=; setup(ro,,n+); int l,r; for (; m; --m) { l=read(),r=read(); if (l==r) continue; reverse(l,r); } dfs(ro); ; }
[luogu P3391] 文艺平衡树的更多相关文章
- Luogu P3391 文艺平衡树(Splay or FHQ Treap)
这道题要求区间反转...好东西.. 对于Splay:把l-1旋到根,把r+1旋到根的右儿子,这样r+1的左儿子就是整个区间了,然后对这个区间打个tg 注意要插-Inf和Inf到树里面,防止越界,坐标要 ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- BZOJ3223/洛谷P3391 - 文艺平衡树
BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...
- P3391 文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 【Luogu】P3391文艺平衡树(Splay)
题目链接 ddosvoid和自为风月马前卒教了我这道题 他们好强啊 如果我们要反转区间[l,r] 我们首先把l的前驱旋转到根节点 再把r的后继旋转到根节点的右儿子 那么此时根节点的右儿子的左儿子所代表 ...
- 洛谷 P3391 文艺平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...
- 洛谷P3391文艺平衡树(Splay)
题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...
- P3391 文艺平衡树
hh 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
- 【题解】P3391 文艺平衡树
用pb_ds库中的rope水过去的,忽然发现这玩意能水好多模拟题. 详见这个博客:背景的小姐姐真的好看 声明 #include <ext/rope> using namespace __g ...
随机推荐
- java之过滤器
form.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- npm命令
简介:npm(node.js package manager)是Node.js的包管理器 .它创建于2009年,作为一个 开源项目,帮助开发人员轻松共享打包的代码模块 ## 默认方式初始化npm.(进 ...
- Tomcat笔记 #01# WEB应用管理工具简介
索引 查看JVM以及SERVLET/接口的情况 动态管理WEB应用 Tomcat自带了一个基于网页的web应用管理工具,可以帮助我们监控&管理部署上去的WEB APP,特别方便!恰好之前碰到的 ...
- CH 5102Mobile Service题解
题目: 用动态规划很容易将完成任务量作为dp的阶段,通过指派服务员,从当前i-1个任务转移到i个任务: 我们可以用一个四维数组f[i][x][y][z]来表示在完成当前任务i时,三个机器人分别在x,y ...
- 基于OpenCV做“三维重建”(1)--找到并绘制棋盘
<OpenCV计算机视觉编程攻略(第3版)>这套书已经出到第3版了,如果你非要我说这本书有多好,我说不出来:只是很多我第一手的例子都是来源于这本书的-相比较OpenCV官方提供的代码,这本 ...
- Bugku-CTF之速度要快
Day21 速度要快 速度要快!!!!!! http://123.206.87.240:8002/web6/
- md5 collision(md5碰撞)之记录一些MD5值
md5 collision之记录一些MD5值 “Magic Hash”的PHP漏洞可以使得攻击者非法获取用户的账号信息. 漏洞原因: PHP以一种特定的方式处理被哈希的字符串,攻击者可以利用其 ...
- android开发_ViewGroup(组视图)-- 五大布局
view组--ViewGroup(组视图) ViewGroup的作用:在view中添加子控件.ViewGroup的5个子类,就是五大布局: (1) LinearLayout 线性布局(常用) (2) ...
- Java实训作业1
1.编写程序:声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果 2.编写程序:从键盘输入圆的半径,计算圆的面积并输出. 3.编写程序:实现一个数字加密器.运行时输入加密 ...
- asp.net简繁体转换
简繁体转换添加Microsoft.VisualBasic.dll引用 //简转繁 string str= Microsoft.VisualBasic.Strings.StrConv("民生银 ...