题目描述:
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是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. (转)JMeter性能测试-服务器资源监控插件详解

    零.引言 我们对被测应用进行性能测试时,除了关注吞吐量.响应时间等应用自身的表现外,对应用运行所涉及的服务器资源的使用情况,也是非常重要的方面,通过实时监控,可以准确的把握不同测试场景下服务器资源消耗 ...

  2. k8s--kubernetes存储之Volume

    Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时, kubelet会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的状态 ...

  3. tableau单机版安装

    参考: https://help.tableau.com/current/server-linux/zh-cn/requ.htm   先将服务器防火墙80级8850端口打开 临时关闭SELinux/防 ...

  4. Centos7安装Beanstalkd

    安装 //安装 yum -y install beanstalkd --enablerepo=epel //查看版本 beanstalkd -v //启动 -b断电重启会恢复 /usr/bin/bea ...

  5. npm学习(五)之使用package.json

    使用package.json 管理本地安装的npm包的最佳方法是创建一个package.json文件. 一个packagejson文件: 列出项目所依赖的包. 允许使用语义版本控制规则指定项目可以使用 ...

  6. JS作用域及域解析规则

    1.JS作用域:变量和函数作用的范围. 2.JS解析器可以分为域解析和逐行解读代码两个过程. 域解析:1.当进行域解析的时候,一旦找到var,就会提取后面的变量名,并给它赋值给undefined. 2 ...

  7. openlayers之地图测距侧面

    项目背景vue-cli3.0 public下html需要引入文件 <link rel="stylesheet" href="<%= BASE_URL %> ...

  8. node.js安装后输入“node -v”提示'node' 不是内部或外部命令,也不是可运行的程序的解决方法

    换个电脑,重新搭配环境的时候遇到的问题.node.js已经在官网进行下载安装了,但是VScode里面显示不是内部的命令,也不是可运行的程序 但是在cmd控制台还是能查到的 借助网上的方法进行了测试和调 ...

  9. 现身说法:面对DDoS攻击时该如何防御?

    上周,我们的网站遭到了一次DDoS攻击.虽然我对DDoS的防御还是比较了解,但是真正遇到时依然打了我个措手不及.DDoS防御是一件比较繁琐的事,面对各种不同类型的攻击,防御方式也不尽相同.对于攻击来的 ...

  10. 2019-11-29-dotnet-使用-Qpush-快速从电脑到手机推送文字

    title author date CreateTime categories dotnet 使用 Qpush 快速从电脑到手机推送文字 lindexi 2019-11-29 08:58:57 +08 ...