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

输入:

第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n

输出:

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

样例输入:
5 3
1 3
1 3
1 4

样例输出:

4 3 2 1 5

数据范围:

N,M<=100000

题解:

直接splay,打个rev标记就好了。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#else
#define debug(...)
#endif #define R register
#define getc() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
#define gmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define gmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1<<15],*S=B,*T=B;
inline int FastIn()
{
R char ch;R int cnt=0;R bool minus=0;
while (ch=getc(),(ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ?minus=1:cnt=ch-'0';
while (ch=getc(),ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus?-cnt:cnt;
}
#define maxn 100010
bool rev[maxn];
int fa[maxn] , ch[maxn][2] , size[maxn] , root , n;
inline void update (R int x)
{
R int ls = ch[x][0] , rs = ch[x][1];
size[x] = size[ls] + size[rs] + 1;
}
void Build (R int l , R int r , R int rt)
{
if (l > r) return ;
R int mid = (l + r) >> 1;
fa[mid] = rt;
if (mid < rt) ch[rt][0] = mid;
else ch[rt][1] = mid;
Build(l , mid-1 , mid);
Build(mid+1 , r , mid);
update(mid);
}
inline void pushdown (R int x)
{
R int ls = ch[x][0] , rs = ch[x][1];
if (rev[x])
{
if (ls) rev[ls] ^= 1 ;
if (rs) rev[rs] ^= 1 ;
ch[x][0] = rs ; ch[x][1] = ls;
rev[x] = 0;
}
}
inline void rotate(R int x)
{
R int f = fa[x] , gf = fa[f] , d = (ch[f][1] == x);
if (f==root) root = x , ch [0][0] = x;
(ch[f][d] = ch[x][d ^ 1]) >0 ? fa[ch[f][d]] = f : 0;
(fa[x] = gf )> 0 ? ch[gf][ch[gf][1]==f] = x : 0;
fa[ch[x][d^1] = f] = x;
update (f);
}
inline void splay(R int x , R int rt)
{
while (fa[x]!=rt)
{
R int f = fa[x] , gf = fa[f];
if (gf != rt) rotate ( (ch[gf][1] == f) ^ (ch[f][1] == x) ? x : f );
rotate (x);
}
update(x);
}
int find(R int x , R int rank)
{
if (rev[x]) pushdown(x);
R int ls = ch[x][0] , rs = ch[x][1] ,lsize = size[ls];
if (lsize+1 == rank) return x;
if (lsize >= rank ) return find(ls , rank);
else return find(rs , rank -lsize -1);
}
inline int prepare (R int l,R int r)
{
R int x = find (root ,l-1 );
splay(x , 0);
x = find(root , r+1) ;
splay(x , root);
return ch[x][0];
}
inline void rever(R int l,R int r)
{
R int x = prepare (l,r);
rev[x] ^= 1;
pushdown(x);
}
inline void print(R int x)
{
if (!x) return;
if (rev[x]) pushdown(x);
R int ls = ch[x][0] , rs = ch[x][1];
print(ls);
if (x != 1 && x!=n )printf("%d ",x -1 );
print(rs);
}
int main()
{
n = FastIn()+2 ;R int m = FastIn();
Build(1 , n , 0);
root = ( 1 + n ) >> 1;
for (; m ; m--)
{
R int l = FastIn() + 1 , r = FastIn() + 1;
rever( l , r );
}
splay(1,0);
print(root);
return 0;
}

【bzoj3223】Tyvj 1729 文艺平衡树的更多相关文章

  1. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

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

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

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

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

  4. 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

  5. BZOJ3223——Tyvj 1729 文艺平衡树

    1.题目大意:维护序列,只有区间翻转这个操作 2.分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了 然后就是记得各种的操作访问某个点时,记得下传,顺便交换 ...

  6. bzoj3223: Tyvj 1729 文艺平衡树 splay裸题

    splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...

  7. 【Splay】bzoj3223 Tyvj 1729 文艺平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...

  8. BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap

    一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...

  9. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

  10. BZOJ 3223: Tyvj 1729 文艺平衡树

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

随机推荐

  1. excel常用快捷键和技巧

    1. Ctrl+方向键,对单元格光标快速移动,移动到数据边缘(空格位置). 2. Ctrl+方向键,对单元格光标快速移动,移动到数据边缘(空格位置). 3. Ctrl+A,选择整张表. 4. Ctrl ...

  2. 交换机安全学习笔记 第六章 IPV4 ARP攻击

    ARP欺骗攻击 常用工具:  dsniff(Linux/windows).ettercap(Linux/windows).cain(仅windows). ARP欺骗攻击的目的是嗅探发往某主机的所有IP ...

  3. CentOS7Linux中服务器LVS负载均衡、高可用集群搭建(NAT、DR);

    目录 集群 声明 集群概念 集群特性 Web服务器并发相应瓶颈 集群的分类 LB实现方法: LVS集群 负载调度器 服务器池 共享存储 LVS负载均衡的三种模式 负载均衡 集群 声明 文档不断更新中. ...

  4. sublime text 3 环境设置

    1. 设置build system 环境 tool -> build system -> new build system ,粘贴以下代码并保存 { "cmd":[&q ...

  5. decode与case when 函数

    百度百科: DECODE函数,是ORACLE公司的SQL软件ORACLE PL/SQL所提供的特有函数计算方式,以其简洁的运算方式,可控的数据模型和灵活的格式转换而闻名. DECODE 中的if-th ...

  6. ORA-01846: 周中的日无效

    参考这篇博客:https://blog.csdn.net/yabingshi_tech/article/details/8678218

  7. HTTPS到底是什么

    Http存在的问题   上过网的朋友都知道,网络是非常不安全的.尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵.还有大家平时喜欢用的万能钥匙,等等.那我们平时上网可能会存在哪些风险呢?   ...

  8. 【Java】 ArrayList和LinkedList实现(简单手写)以及分析它们的区别

    一.手写ArrayList public class ArrayList { private Object[] elementData; //底层数组 private int size; //数组大小 ...

  9. host - 使用域名服务器查询主机名字

    SYNOPSIS (总览) host [-l ] [-v ] [-w ] [-r ] [-d ] [-t querytype ] [-a ] host [server ] DESCRIPTION (描 ...

  10. 关于ARM PC值

    PC值(Program Counter). ARM采用流水线来提高CPU的利用效率, 对于三级流水线, 一条汇编指令的执行包括 取值,  译码, 执行三个阶段. 当MOV指令的取指动作完毕后, 进入M ...