题目背景

这是一道经典的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 n 1≤l≤r≤n

输出格式:
输出一行n个数字,表示原始序列经过m次变换后的结果

输入输出样例

输入样例#1:
5 3
1 3
1 3
1 4
输出样例#1: 
4 3 2 1 5

题解:打标记的splay!调了一个上午终于调出来了!继续挖坑~

代码如下:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std; struct Splay
{
int key[N],son[N][],size[N],fa[N],tag[N],rt,sz,pos;
inline void push_up(int x)
{
size[x]=size[son[x][]]+size[son[x][]]+;
}
inline void push_down(int x)
{
if(!tag[x])
{
return;
}
tag[x]=;
tag[son[x][]]^=;
tag[son[x][]]^=;
swap(son[x][],son[x][]);
}
inline void rotate(int x)
{
int y=fa[x],z=fa[y],k=(son[y][]==x);
son[z][son[z][]==y]=x;
fa[x]=z;
son[y][!k]=son[x][k];
fa[son[x][k]]=y;
son[x][k]=y;
fa[y]=x;
push_up(y);
}
inline void splay(int x,int goal)
{
for(push_down(x); fa[x]!=goal; rotate(x))
{
int y=fa[x],z=fa[y];
if(z!=goal)
{
(son[y][]==x)^(son[z][]==y)?rotate(x):rotate(y);
}
}
push_up(x);
if(!goal)
{
rt=x;
}
}
inline int kth(int k)
{
for(int x=rt;;)
{
push_down(x);
int y=son[x][];
if(k>size[y]+)
{
k-=size[y]+;
x=son[x][];
}
else
{
if(k>size[y])
{
return x;
}
else
{
x=y;
}
}
}
}
inline void reverse(int l,int r)
{
if(l>r)
{
swap(l,r);
}
int x=kth(l),y=kth(r+);
splay(x,);
splay(y,x);
tag[son[y][]]^=;
}
inline int build(int *a,int father,int l,int r)
{
if(l>r)
{
return ;
}
int mid=(l+r)>>,x=++sz;
fa[x]=father;
key[x]=a[mid];
son[x][]=build(a,x,l,mid-);
son[x][]=build(a,x,mid+,r);
push_up(x);
return x;
}
inline void put(int x)
{
push_down(x);
if(son[x][])
{
put(son[x][]);
}
if(key[x]>-1e9&&key[x]<1e9)
{
printf("%d ",key[x]);
}
if(son[x][])
{
put(son[x][]);
}
}
} splay1; int main()
{
int n,m,l,r,a[]; scanf("%d%d",&n,&m);
for(int i=; i<=n+; i++)
{
a[i]=i-;
}
a[]=-1e9;
a[n+]=1e9;
splay1.rt=splay1.build(a,,,n+);
for(int i=; i<=m; i++)
{
scanf("%d%d",&l,&r);
splay1.reverse(l,r);
}
splay1.put(splay1.rt);
}

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

  1. JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树

    http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...

  2. [bzoj3223]文艺平衡树(splay区间反转模板)

    解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  3. [bzoj3223]文艺平衡树——splay

    题意 你应当编写一个数据结构,支持以下操作: 反转一个区间 题解 我们把在数组中的位置当作权值,这样原序列就在这种权值意义下有序,我们考虑使用splay维护. 对于操作rev[l,r],我们首先把l- ...

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

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

  5. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  6. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

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

  7. bzoj3223 文艺平衡树 (treap or splay分裂+合并)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3313  Solved: 1883 [Submit][S ...

  8. Tyvj P1729 文艺平衡树 Splay

    题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...

  9. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

随机推荐

  1. Use the dkms from EPEL when install CUDA Toolkits on CentOS

    ###Use the dkms from EPEL. yum install epel-release yum install dkms # download the rpm from the NVi ...

  2. Restore Nexus 5 to Stock and Flash Factory Images

    1.This is the website to download Factory Images for Nexus Devices https://developers.google.com/and ...

  3. $GLOBALS超级全局变量(PHP学习)

    1.$GLOBALS是一个数组,里面有所有的全局变量 2.$GLOBALS是超级全局变量,函数内部可以通过它直接操作全局变量.(严重不推荐,因为违反了封装原则) 3.通过$GLOBALS操作全局变量, ...

  4. 多线程设计模式(二):Future模式

    一.什么是Future模型: 该模型是将异步请求和代理模式联合的模型产物.类似商品订单模型.见下图: 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订 ...

  5. xunsearch进阶使用

    目录 设置分页 设置排序 读取文档结果 搜索结果高亮处理 获取数量 获取热门搜索词 获取相关搜索词 设置分页 $search->setLimit(5); // 设置返回结果为前 5 条 $sea ...

  6. python开发进程:进程开启方式&多进程

    一,进程的开启方式 利用模块开启进程 from multiprocessing import Process import time,random import os def piao(name): ...

  7. Unity3D的坑系列:打包Assetbundle丢失Shader问题(贴图显示不了)

    从Unity4.2开始,为了减少首包大小,不会默认将所有Shader引擎加到游戏程序中,据Unity技术支持人员所说,Unity会将Shader引擎打包到Assetbundle资源中,但是我测试发现不 ...

  8. niosII SDRAM ,FLASH (学习特权)

    环境: quartus v13.0  64位. DE2 cycloneII EP2C35F672C6N (学校的开发板,还是想同学借的呵呵) 主要实现flash的烧录,虽然实现了但是还是有很多运气的成 ...

  9. 【linux】查看进程使用的端口和端口使用情况

    netstat -a 查看所有服务端口 netstat -tln 查看当前使用的端口   ps命令查看进程的id: ps aux | grep ftp 或者 pidof Name   netstat命 ...

  10. 委托BegionInvoke和窗体BegionInvoke

    委托BegionInvoke是指通过委托方法执行多线程任务,例如: //定义委托成员变量 delegate  void dg_DeleAirport(); //指定委托函数 dg_DeleAirpor ...