P3391 【模板】文艺平衡树(Splay)
时间:2022-05-08
本文章向大家介绍P3391 【模板】文艺平衡树(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次变换后的结果
输入输出样例
输入样例#1:
5 3
1 3
1 3
1 4
输出样例#1:
4 3 2 1 5
说明
n, m leq 100000n,m≤100000
splay的模板题。
splay在解决区间问题的时候是先把l旋转到根节点,再把r旋转到根节点的右孩子,
然后给根节点的右孩子的左孩子打上标记。
递归修改即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=100001;
inline void read(int &n)
{ char c='+';int x=0;bool flag=0;
while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();}
n=flag==1?-x:x;
}
struct node
{
int fa,ch[2];// 左右孩子
int size;//大小
bool rev; // 是否需要旋转
}tree[MAXN];
int root=0;
int n,m;
inline void update(int x)
{tree[x].size=tree[tree[x].ch[0]].size+tree[tree[x].ch[1]].size+1;}
inline void connect(int x,int f,bool how)
{tree[x].fa=f; tree[tree[x].fa].ch[how]=x;}
inline void pushdown(int x)
{
if(tree[x].rev)
swap(tree[x].ch[0],tree[x].ch[1]),
tree[tree[x].ch[0]].rev^=1,tree[tree[x].ch[1]].rev^=1,tree[x].rev=0;
}
int build(int l,int r)
{
if(l>r) return 0;
int mid=(l+r)>>1;
connect(build(l,mid-1),mid,0); connect(build(mid+1,r),mid,1);
tree[mid].rev=0;
update(mid); return mid;
}
inline bool get(int x)
{
return tree[tree[x].fa].ch[1]==x;
}
inline int find(int x)
{
--x;int now=root;pushdown(now);
while(x!=tree[tree[now].ch[0]].size)
{
if(tree[tree[now].ch[0]].size<x) x-=tree[tree[now].ch[0]].size+1, now=tree[now].ch[1];
else now=tree[now].ch[0];
pushdown(now);
}
return now;
}
inline void rotate(int x)
{
int f=tree[x].fa;bool d=get(x);
if(f==root) root=x,tree[x].fa=0;
else connect(x,tree[f].fa,get(f));
connect(tree[x].ch[!d],f,d);
connect(f,x,!d);
update(f);
}
inline void splay(int x,int r)
{
if(x==r) return ;
for(int f;(f=tree[x].fa)!=r;)
{
if(tree[f].fa==r){rotate(x);break;}
rotate( (get(x)==get(f))?f:x ); rotate(x);
}
update(x);
}
inline void out(int x)
{
if(!x) return ;
pushdown(x);
out(tree[x].ch[0]);
if(x!=1&&x!=n+2) printf("%d ",x-1);
out(tree[x].ch[1]);
}
int main()
{
freopen("sph.in","r",stdin);
freopen("sph.out","w",stdout);
read(n);read(m);
root=build(1,n+2);
int l,r,tmp;
for(int i=1;i<=m;i++)
{
read(l);read(r);
splay(find(l),0);
tmp=find(r+2); splay(tmp,root);
tree[tree[tmp].ch[0]].rev^=1;
}
out(root);
return 0;
}
- React第三方组件2(状态管理之Refast的使用①简单使用)
- uva Excuses, Excuses!
- React第三方组件5(状态管理之Redux的使用④TodoList下)
- 2017/6/9-Python文件读写的方法
- React第三方组件5(状态管理之Redux的使用③TodoList中)
- R语言在收入不平等指标测度上的应用~
- React第三方组件5(状态管理之Redux的使用②TodoList上)
- sscanf
- sprintf的用法
- 01背包精讲
- uva Andy's First Dictionary
- UVA Hangman Judge
- shiny动态仪表盘应用——中国世界自然文化遗产可视化案例
- Decode the tape
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- HTML加载顺序
- 基于飞桨PaddleClas实现轧钢带表面缺陷分类,top1准确率可达100%
- 01Python的基本的数据结构之List
- 02Python数据结构之再谈List的常用操作
- 03Python List不得不知的操作之改、查
- 04Python基础之字符串Str
- 05Python元组tuple的个性
- Tkinter Canvas
- Python实现最小二乘法
- 一个简单的例子学明白用Python插值
- python 类class基础简明笔记
- 数据离散化及其KMeans算法实现的理解
- [tensorflow损失函数系列]sparse_softmax_cross_entropy_with_logits
- 怎样将Anaconda设置为国内的镜像
- Python实现KMeans算法