3223: Tyvj 1729 文艺平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 6881  Solved: 4213
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5

HINT

N,M<=100000

模板题,区间翻转问题

延时标记的作用是优化,如果一个区间翻转之后再翻转回来,用延时标记就可以优化,不必再翻转。比如翻转[1,4],再翻转[1,4],就可以延时标记优化。

其他的代码里写了注释。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll; const double PI=acos(-1.0);
const double eps=1e-;
const ll mod=1e9+;
const int inf=0x3f3f3f3f;
const int maxn=1e5+;
const int maxm=+;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); /*
将当前排名为l-1 +1 的节点转到根
将当前排名为r+2的节点转到根的右子树的根节点
则根的右子树的根节点的左子树为所求区间
直接打标记就可以了
*/ int n,m,sz,rt,pre[maxn],l,r,ch[maxn][],data[maxn],size[maxn],rev[maxn]; //在爸爸节点打上标记,然后进行下放,如果进行了两次相反的翻转,lazy标记就会消失,这样就减少了翻转次数达到优化 void pushup(int k)//要先pushup儿子才能pushup爸爸
{
size[k]=size[ch[k][]]+size[ch[k][]]+;//当前节点的size为左子树+右子树+自己
} void pushdown(int k)//要先pushdown爸爸才能pushdown儿子
{
int l=ch[k][],r=ch[k][];//左儿子和右儿子
if(rev[k]){//翻转区间
swap(ch[k][],ch[k][]);//翻转左右儿子
rev[l]^=;rev[r]^=;//标记下传
rev[k]=;//当前节点标记去掉
}
} void rotate(int x,int &k)//翻转操作
{
int y=pre[x],z=pre[y],l,r;
if(ch[y][]==x) l=;
else l=;
r=l^;
if(y==k) k=x;
else{if(ch[z][]==y) ch[z][]=x;else ch[z][]=x;}
pre[x]=z;pre[y]=x;pre[ch[x][r]]=y;
ch[y][l]=ch[x][r];ch[x][r]=y;
pushup(y);pushup(x);
} void splay(int x,int &k)//splay到目标状态
{
while(x!=k){
int y=pre[x],z=pre[y];
if(y!=k){
if(ch[y][]==x^ch[z][]==y)rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} int find(int k,int rank)
{
pushdown(k);//有标记就pushdown
int l=ch[k][],r=ch[k][];
if(size[l]+==rank) return k;
else if(size[l]>=rank) return find(l,rank);
else return find(r,rank-size[l]-);
} void change(int l,int r)
{
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,ch[x][]);
int z=ch[y][];
rev[z]^=;
} void build(int l,int r,int f)
{
if(l>r) return;
int now=data[l],last=data[f];
if(l==r){
pre[now]=last;
size[now]=;
if(l<f) ch[last][]=now;
else ch[last][]=now;
return;
} int mid=(l+r)>>;
now=data[mid];
build(l,mid-,mid);
build(mid+,r,mid);
pre[now]=last;
pushup(mid);
if(mid<f) ch[last][]=now;
else ch[last][]=now;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n+;i++)
data[i]=++sz;
build(,n+,);//建树,建两个哨兵节点为1,n+2。
rt=(n+)>>;//中点为rt
for(int i=;i<=m;i++){
scanf("%d%d",&l,&r);
change(l,r);
}
for(int i=;i<=n+;i++)
printf("%d ",find(rt,i)-);//去掉哨兵节点
return ;
}

先贴个板子,有的操作并不理解,过几天再看。

BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题的更多相关文章

  1. [BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转

    题目不说了,就是区间翻转 传送门:BZOJ 3223 和 CodeVS 3243 第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...

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

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

  3. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  4. bzoj 3223/tyvj 1729 文艺平衡树 splay tree

    原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...

  5. BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)

    题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...

  6. BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系

    题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...

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

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

  8. BZOJ 3223 Tyvj 1729 文艺平衡树(Splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3223 [题目大意] 给出一数列,问m次区间翻转后的结果. [题解] Splay 区间翻 ...

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

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

随机推荐

  1. springboot 学习笔记(二)--- properties 配置

    springboot可以提供了多种方式配置properties. 一.Java System.setProperty(k, v) System.setProperty("myname&quo ...

  2. [剑指Offer] 25.复杂链表的复制

    /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : ...

  3. bootstrap、angularJS、nodeJs、reactJs视频教程

    bootstrap.angularJS.nodeJs.reactJs视频教程 发布时间:『 2017-06-25 19:50』  博客类别:资源下载  阅读(74) 评论(0) 智能社与达内哪个好?说 ...

  4. 手动安装GCC

    01sunxiaoqiang的博客 Centos离线手动安装gcc.g++教程 转载 2016-11-06 17:35:18 标签:linux应用笔记 在安装LINUX系统的时候很可能会没有安装gcc ...

  5. Bash 实例,第一部分

    您可能要问:为什么要学习 Bash 编程?好,以下是几条令人信服的理由: 已经在运行它 如果查看一下,可能会发现:您现在正在运行 bash.因为 bash 是标准 Linux shell,并用于各种目 ...

  6. MySQL rpm 版本安装

     准备: [root@localhost moudles]# ls MySQL-client-5.6.36-1.linux_glibc2.5.x86_64.rpm MySQL-server-5.6.3 ...

  7. Spring 学习笔记(二)

      一.Spring 中的bean配置 –配置形式:基于 XML 文件的方式:基于注解的方式 –Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).Fac ...

  8. 着色方案(bzoj 1079)

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...

  9. NYOJ 284 坦克大战 (广搜)

    题目链接 描述 Many of us had played the game "Battle city" in our childhood, and some people (li ...

  10. 结构化数据(structured),半结构化数据(semi-structured),非结构化数据(unstructured)

    概念 结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据. 半结构化数据:介于完全结构化数据(如关系型数据库.面向对象数据库中的数据)和完全无结构的数据(如声音.图像文件等)之 ...