题意:

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

分析:

splay维护区间操作的模板题。

节点维护区间信息。

提取区间:把l-1旋到根,再把r+1旋到根的右儿子,那么根的右儿子的左子树则是我们需要的区间。

建树:递归建树,左儿子还是右儿子取决于在当前区间的位置。

区间反转:打标记的思想,每个标记只对儿子生效。

其他:建两个哨兵节点来保护1和n

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 100050
  6. int ch[N][2],f[N],siz[N],val[N];
  7. int rt,sz,n,m,tag[N];
  8. void clear(int x){ ch[x][0]=ch[x][1]=f[x]=siz[x]=val[x]=0; }
  9. int get(int x){ return ch[f[x]][1]==x; }
  10. void up(int x){ if(x)siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;}
  11. void pud(int x){ if(!tag[x])return ;tag[x]=0;swap(ch[x][0],ch[x][1]);tag[ch[x][0]]^=1;tag[ch[x][1]]^=1; }
  12. void rotate(int x)
  13. {
  14. int y=f[x],z=f[y],k=get(x);
  15. ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;ch[x][k^1]=y;f[y]=x;f[x]=z;
  16. if(z) ch[z][ch[z][1]==y]=x; up(y),up(x);
  17. if(rt==y)rt=x;
  18. }
  19. void splay(int x,int y)
  20. {
  21. for(int fa;(fa=f[x])!=y;rotate(x))
  22. if(f[fa]!=y)
  23. rotate((get(x)==get(fa)) ? fa : x);
  24. }
  25. int find(int x)
  26. {
  27. int now=rt;
  28. while(1)
  29. {
  30. pud(now);
  31. if(x<=siz[ch[now][0]])now=ch[now][0];
  32. else
  33. {
  34. x-=siz[ch[now][0]]+1;
  35. if(!x)return now;
  36. now=ch[now][1];
  37. }
  38. }
  39. }
  40. void build(int fa,int l,int r)
  41. {
  42. if(l>r)return ;
  43. int mid = l + r >> 1;
  44. ch[fa][mid > fa] = mid;
  45. siz[mid] = 1;
  46. val[mid] = mid - 1;
  47. f[mid] = fa;
  48. build(mid, l, mid - 1);
  49. build(mid, mid + 1, r);
  50. up(mid);
  51. }
  52. void reverse(int x,int y)
  53. {
  54. x=find(x);
  55. y=find(y);
  56. splay(x,f[rt]);
  57. splay(y,rt);
  58. tag[ch[y][0]]^=1;
  59. }
  60. int main()
  61. {
  62. scanf("%d%d", &n, &m);
  63. int i,x,y;
  64. build(0,1,n+2);
  65. rt=n+3>>1;
  66. for(i=1;i<=m;i++)
  67. {
  68. scanf("%d%d",&x,&y);
  69. reverse(x,y+2);
  70. }
  71. for(i=2;i<=n;i++) printf("%d ",val[find(i)]);
  72. printf("%d",val[find(n+1)]);
  73. }

BZOJ_3223: Tyvj 1729 文艺平衡树 _splay的更多相关文章

  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. BZOJ 3223: Tyvj 1729 文艺平衡树

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

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

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

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

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

  6. 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1347  Solved: 724[Submit][Stat ...

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

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

  8. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

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

  9. tyvj 1729 文艺平衡树

    文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...

随机推荐

  1. JVM的运行原理以及JDK 7增加的新特性(二)

    JVM结构 Java编写的代码会按照下图的流程来执行 类装载器装载负责装载编译后的字节码,并加载到运行时数据区(Runtime Data Area),然后执行引擎执行会执行这些字节码. 类加载器(Cl ...

  2. 手动编译Flume

    1.源码下载: 我用的是1.6版,因为加了kafka-sink,下载地址 http://www.apache.org/dyn/closer.cgi/flume/1.6.0/apache-flume-1 ...

  3. Android开发之深入理解Android 7.0系统权限更改相关文档

    http://www.cnblogs.com/dazhao/p/6547811.html 摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限 ...

  4. DjangoUeditor项目的集成

    DjangoUeditor这个项目,出品人已经不再提供维护支持. 最近在一个使用到aliyun oss的项目里集成了一次这个东西,当然我之前在普通文件上传的北京下已经集成过很多次了. 主要修改的东西就 ...

  5. Python练习题-1.使用匿名函数对1~1000求和,代码力求简洁。

    Python 练习 标签(空格分隔): Python Python练习题 Python知识点 一.使用匿名函数对1~1000求和,代码力求简洁. 答案: In [1]: from functools ...

  6. erlang的脚本执行---escript

    1.概述: 作为程序员对于脚本语言应该很熟悉了,脚本语言的优点很多,如快速开发.容易编写.实时开发和执行, 我们常用的脚本有Javascript.shell.python等,我们的erlang语言也有 ...

  7. java线程之线程通信控制

    在上篇我们看到,A线程往公共资源库(对象)提供了一条数据,然后B线程从库中提取了数据并打印出来. 实际项目中,我们不可能只往库中提供一条数据,而且库的大小也不会是无穷大的,那么我们就会有这样一 个需求 ...

  8. OpenCASCADE Texture Mapping

    OpenCASCADE Texture Mapping eryar@163.com Abstract. 纹理贴图技术的出现和流行是图形显示技术的一个非常重要的里程碑,直接影响3D技术从工业进入娱乐领域 ...

  9. (干货)微信小程序之转发好友

    今天简单地说下微信小程序的转发功能,为什么要简单的说下呢,因为主要讲的就是转发给好友或者群组,还有一种是分享到朋友圈,这种就比较复杂一点了,先稍微透漏一点,分享到朋友圈主要是两种方法,一种是后台直接生 ...

  10. Egg Dropping Puzzle问题的分析

    首先,基本问题是这样:You are given two eggs, and access to a 100-storey building. The aim is to find out the h ...