文艺平衡树(luogu)

Description

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列。

其中需要提供以下操作:翻转一个区间,例如原有序序列是 5\ 4\ 3\ 2\ 15 4 3 2 1,翻转区间是 [2,4][2,4] 的话,结果是 5\ 2\ 3\ 4\ 15 2 3 4 1。

输入格式

第一行两个正整数 n,mn,m,表示序列长度与操作个数。序列中第 ii 项初始为 ii。
接下来 mm 行,每行两个正整数 l,rl,r,表示翻转的区间。

输出格式

输出一行 nn 个正整数,表示原始序列经过 mm 次变换后的结果。

Code

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N=,inf=;
int sum,n,root,m,l,r,d[N],fa[N],size[N],s[N][],v[N],tag[N];
inline int which(int x)
{
return x==s[fa[x]][]?:;
}
inline void push_up(int g)
{
if(g){
size[g]=;
if(s[g][]) size[g]+=size[s[g][]];
if(s[g][]) size[g]+=size[s[g][]];
}
}
void built(int l,int r,int &g)
{
if(l>r) return ;
g=++sum;
size[g]=;
int mid=(l+r)>>;
v[g]=d[mid];
built(l,mid-,s[g][]);
built(mid+,r,s[g][]);
fa[s[g][]]=fa[s[g][]]=g;
push_up(g);
}
inline void push_down(int g)
{
if(g && tag[g]){
tag[s[g][]]^=,tag[s[g][]]^=;
swap(s[g][],s[g][]),tag[g]=;
}
}
inline int find(int x)
{
int now=root;
while()
{
push_down(now);
if(size[s[now][]]>=x) now=s[now][];
else
{
x-=size[s[now][]]+;
if(x>) now=s[now][];
else return now;
}
}
}
inline void rotate(int x)
{
int f=fa[x],oldf=fa[f];
push_down(f),push_down(x);
int w=which(x),ww=which(f);
s[f][w]=s[x][w^];
fa[s[x][w^]]=f;
fa[f]=x,fa[x]=oldf;
s[x][w^]=f;
if(oldf) s[oldf][s[oldf][]==f]=x;
push_up(f),push_up(x);
}
inline void splay(int x,int g)
{
for(int i;(i=fa[x])!=g;rotate(x))
if(fa[i]!=g) rotate(which(i)==which(x)?i:x);
if(g==) root=x;
}
inline void re(int l,int r)
{
l=find(l-),r=find(r+);
splay(l,),splay(r,l);
int pos=s[s[root][]][];
tag[pos]^=;
}
void dfs(int x)
{
push_down(x);
if(s[x][]) dfs(s[x][]);
if(v[x]!=-inf && v[x]!=inf) printf("%d ",v[x]);
if(s[x][]) dfs(s[x][]);
}
int main()
{
scanf("%d%d",&n,&m);
d[]=-inf,d[n+]=inf;
for(int i=;i<=n;i++) d[i+]=i;
built(,n+,root);
for(int i=;i<m;i++)
{
scanf("%d%d",&l,&r);
re(l+,r+);
}
dfs(root);
return ;
}

文艺平衡树(区间splay)的更多相关文章

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

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

  2. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

  3. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

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

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

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

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

  6. 文艺平衡树(Splay)

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

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

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

  8. P3391 文艺平衡树(Splay)

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

  9. 普通平衡树与文艺平衡树的splay代码

    主要综合借鉴了yyb和马前卒两位大佬的. //普通平衡树 #include <cstdio> #include <cctype> #include <cstring> ...

  10. 【模板】文艺平衡树(Splay) 区间翻转 BZOJ 3223

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 N,M<= ...

随机推荐

  1. 用mingw静态编译Qt4.8.2和Qt5.1.1(需要修改不少源码)

    因为一些乱七八糟的原因,我需要用mingw静态编译Qt4.8.2和Qt5.1.1.经历了一天的折腾之后,自觉编译一下Qt还是件颇为麻烦的事情,故将过程略作总结,以备不时之需. 首先,在编译之前,我需要 ...

  2. CentOS 7防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭firewall: systemctl stop firewalld.service #停止f ...

  3. Math类入门学习

    Math类 Math类包含用于执行基本的数字运算等基本指数.对数.平方根法.三角函数. import java.lang.*; public class TestMath { public stati ...

  4. ansible安装与核心组件详解

    第1章 安装anisble 1.1 安装epel源 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarc ...

  5. 听说你的 IDEA 昨天掉链子了?松哥给你准备了大招

    昨天一直在忙,中午抽空瞅了一眼技术群,天呐,竟然都在切磋 IDEA 激活码的事情,瞬间明白可能 jetbrains 又在搞事情了. 我大概了解了下,这次出事的主要是 2019 版,之前的 2018 版 ...

  6. js中getBoundingClientrRect()方法的详解

    getBoundingClientRect(): 这个方法返回一个矩形对象,包含四个属性:left.top.right和buttom.分别表示元素各边与页面各边的距离 例如: var boxPosit ...

  7. linux的指令与文件的搜寻

    1.指令路径搜索which 用法:which [-a] command 选项或参数:-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称  2.文件搜索 (1)wher ...

  8. .net core3.1项目在centos7.6上部署经验

    0x00环境搭建 1)使用PuTTY远程登录你的centos 2)yum -y update 更新系统 3)安装宝塔面板: yum install -y wget && wget -O ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子 (莫队)

    题目传送门:小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...

  10. 条款03:尽可能使用const

    目录 1. 总结 2. const对象 3. const函数返回值和函数参数 4. const成员函数 const成员函数的重要性 bitwise constness logical constnes ...