题目描述:
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是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. POJ 3585 Accumulation Degree 题解

    题面 一句话题意:找一个点使得,使得从这个点出发作为源点,发出的流量最大,输出这个最大的流量 这道题是换根法+二次扫描的模板: 首先若确定1为原点,那么可以写出dp方程:当v的度是1时, g[u]+= ...

  2. Luogu P4095 [HEOI2013]Eden的新背包问题

    题目 求出从前往后的背包\(f_{i,j}\)和从后往前的背包\(F_{i,j}\). 那么对于询问\((d,e)\),答案就是\(\max\limits_{i=0}^e f_{d-1,i}+F_{d ...

  3. laravel5.5学习2-路由系统

    一.初识路由 路由系统是所有 PHP 框架的核心,路由承载的是 URL 到代码片段的映射,不同的框架所附带的路由系统是这个框架本质最真实的写照,一丝不挂,一览无余.Laravel 路由中文文档:htt ...

  4. 一个php文件就可以把数据库的数据导出Excel表格

    数据库内容太多,复制粘贴太麻烦?那就用代码实现把,把代码写好了,导出还不容易吗,访问即可导出. excel.php <?php error_reporting(E_ALL ^ E_DEPRECA ...

  5. css练习小总结

    1.div水平居中:/*设置div宽度后,margin:0 auto:*/2.div显示在一行:/*float:left:*/ 3.text-align:/*后面标签里的内容水平居中:*/4.alig ...

  6. js包装类型的装箱拆箱

    https://www.jb51.net/article/155820.htm https://juejin.im/post/5cbaf130518825325050fb0a https://juej ...

  7. “\xef\xbb\xbf”爬坑记录

    今天早上帮同事写了脚本,大致功能:从文本中读取域名,加密存储成按照自己定义的格式.但是一个简单的代码居然出现了错误.初始的代码如下: # coding:utf-8 import hashlib imp ...

  8. iconv - 字符集转换

    总览 (SYNOPSIS) iconv [-f encoding] [-t encoding] [inputfile ...] 描述 (DESCRIPTION) iconv 程序 把 文本 从 一种 ...

  9. iptables-save - 保存 IP Tables

    总览 SYNOPSIS iptables-save [-c] [-t table] 描述 DESCRIPTION iptables-save 用来将 IP Table 转储为可以简单解析的格式,输出到 ...

  10. windows 快捷键相关命令

    Mstsc  远程链接 Taskmgr 任务管理器 Regedit  打开注册表 Netstat -ano | find  “80” 查找内容 tasklist /fi "pid eq 57 ...