文艺平衡树(Splay)
题目背景
这是一道经典的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次变换后的结果
输入输出样例
5 3
1 3
1 3
1 4
4 3 2 1 5
说明
n, m \leq 100000n,m≤100000
splay区间翻转每个区间逐层翻转然后合并
当然我们并不需要每次翻转就直接翻到底,而是打一个标记,类似于线段树,在查询的时候在随着查询的深入翻转
#include<cstdio>
#include<iostream>
using namespace std;
#define N 100005
int n,m;
struct node{
int siz,fa,ch[];//0zuo,1you;
bool rev;
}tr[N];
int root;
void push_down(int rt)
{
if(tr[rt].rev)
{
swap(tr[rt].ch[],tr[rt].ch[]);
tr[rt].rev=;
tr[tr[rt].ch[]].rev^=;tr[tr[rt].ch[]].rev^=;
}
}
void pushup(int rt)
{
tr[rt].siz=tr[tr[rt].ch[]].siz+tr[tr[rt].ch[]].siz+;
return;
}
int find(int rt,int x)
{
if(rt==)return ;
push_down(rt);
if(x<=tr[tr[rt].ch[]].siz)return find(tr[rt].ch[],x);
if(x==tr[tr[rt].ch[]].siz+)return rt;
return find(tr[rt].ch[],x-tr[tr[rt].ch[]].siz-);
}
void rotate(int &rt,int x)
{
int y=tr[x].fa,q=tr[y].fa;
bool dy=tr[y].ch[]==x,dz=tr[q].ch[]==y;
push_down(y);
if(rt==y)rt=x,tr[x].fa=q;
else tr[q].ch[dz]=x,tr[x].fa=q;
tr[y].ch[dy]=tr[x].ch[dy^],tr[tr[x].ch[dy^]].fa=y;
tr[x].ch[dy^]=y,tr[y].fa=x;
pushup(y);
return ;
}
void splay(int &rt,int x)
{
push_down(x);
while(rt!=x)
{
int y=tr[x].fa;int q=tr[y].fa;
if(y!=rt)
{
if(tr[y].ch[]==x^tr[q].ch[]==y)rotate(rt,x);
else rotate(rt,y);
}
rotate(rt,x);
}
pushup(x);
return;
}
void print(int rt)
{
if(rt==)return;
push_down(rt);
print(tr[rt].ch[]);
if(rt>&&rt<n+)printf("%d ",rt-);
print(tr[rt].ch[]);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n+;i++)
{
tr[i].siz=n+-i;tr[i].fa=i-;tr[i].ch[]=i+;
}
tr[n+].ch[]=,root=;
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
splay(root,find(root,l));
splay(tr[root].ch[],find(root,r+));
tr[tr[tr[root].ch[]].ch[]].rev^=;
}
print(root);
return ;
}
文艺平衡树(Splay)的更多相关文章
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- Tyvj P1729 文艺平衡树 Splay
题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- bzoj3223Tyvj 1729 文艺平衡树 splay
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5644 Solved: 3362[Submit][Sta ...
- bzoj 3223: Tyvj 1729 文艺平衡树 (splay)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...
- bzoj 3223 文艺平衡树 - Splay
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3884 Solved: 2235[Submit][Sta ...
- BZOJ3223 文艺平衡树(splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
随机推荐
- Cleaning Shifts POJ - 2376 (贪心题)
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31194 Accepted: 7677 ...
- PTA 7-1 银行业务队列简单模拟
用链表实现队列操作,代码如下: #include <iostream> #include <cstdio> #include <algorithm> #includ ...
- 2019 study list
分析工具: (1)SQL select from where group by having order by limit 运算符(算数运算符+-*/.比较运算符>< ...
- Mybatis中接口和对应的mapper文件位置配置详解
Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...
- Selenium WebDriver- 使用显示等待,判断搜狗的输入框是否显示,按钮是否可点击,然后在输入光荣之路搜索词,然后在点击搜索。
#encoding=utf-8 from selenium import webdriver import time from selenium.webdriver.common.by import ...
- 【LeetCode】Reverse Integer(整数反转)
这道题是LeetCode里的第7道题. 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 ...
- Response.End报错
以下摘抄自博问:https://q.cnblogs.com/q/31506/ try catch中使用Response.End() 我在WebForm中用ajax发送请求到页面index. ...
- HDU——1272小希的迷宫(并查集+拓扑排序)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- windows10下安装ubuntu16.04 双系统
软件和材料: UltraISO .ubuntu16.04镜像.U盘 步骤: 1.先在windows10 上下载UltraISO并安装 2.打开UltraISO,插入优盘,制作ubuntu160.4 ...
- window maven安装(六)
Maven 实战系列之在Windows上安装Maven Maven是一个优秀的构建工具(类似于 Ant, 但比 Ant 更加方便使用),能帮助我们自动化构建过程,从清理.编译.测试到生成报告,再到打包 ...