题意:一开始给出一个序列\(1,2...n\),然后\(m\)次操作,每次把\([l,r]\)翻转并且拼接到序列的后面,求最后形成的序列

打个pushdown标记就好

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<string>
  8. #include<vector>
  9. #include<stack>
  10. #include<queue>
  11. #include<set>
  12. #include<map>
  13. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  14. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  15. #define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
  16. #define iin(a) scanf("%d",&a)
  17. #define lin(a) scanf("%lld",&a)
  18. #define din(a) scanf("%lf",&a)
  19. #define s0(a) scanf("%s",a)
  20. #define s1(a) scanf("%s",a+1)
  21. #define print(a) printf("%lld",(ll)a)
  22. #define enter putchar('\n')
  23. #define blank putchar(' ')
  24. #define println(a) printf("%lld\n",(ll)a)
  25. #define IOS ios::sync_with_stdio(0)
  26. using namespace std;
  27. const int MAXN = 2e5+11;
  28. const double EPS = 1e-7;
  29. typedef long long ll;
  30. const ll MOD = 1e9+7;
  31. unsigned int SEED = 19260817;
  32. const ll INF = 1ll<<60;
  33. ll read(){
  34. ll x=0,f=1;register char ch=getchar();
  35. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  36. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  37. return x*f;
  38. }
  39. inline int Rand(){
  40. SEED=SEED*1103515245+12345;
  41. return SEED/65536;
  42. }
  43. struct Treap{
  44. int son[MAXN][2],root,tot;
  45. int val[MAXN],fix[MAXN],size[MAXN];
  46. bool flip[MAXN];
  47. #define lc son[o][0]
  48. #define rc son[o][1]
  49. void init(){
  50. root=0;
  51. son[0][0]=son[0][1]=0;
  52. val[0]=fix[0]=size[0]=0;
  53. flip[0]=0;
  54. tot=1;
  55. }
  56. int node(int v){
  57. son[tot][0]=son[tot][1]=0;
  58. val[tot]=v; fix[tot]=Rand();
  59. size[tot]=1;flip[tot]=0;
  60. return tot++;
  61. }
  62. void pu(int o){
  63. size[o]=size[lc]+size[rc]+1;
  64. }
  65. void rev(int o){
  66. swap(lc,rc);
  67. flip[o]^=1;
  68. }
  69. void pd(int o){
  70. if(flip[o]){
  71. if(lc) rev(lc);
  72. if(rc) rev(rc);
  73. flip[o]=0;
  74. }
  75. }
  76. void split(int o,int k,int &a,int &b){
  77. if(!o){
  78. a=b=0;
  79. return;
  80. }else if(k<=size[lc]){
  81. pd(o);
  82. b=o;
  83. split(lc,k,a,lc);
  84. pu(o);
  85. }else{
  86. pd(o);
  87. a=o;
  88. split(rc,k-size[lc]-1,rc,b);
  89. pu(o);
  90. }
  91. }
  92. int merge(int a,int b){
  93. if(!a) return b;
  94. if(!b) return a;
  95. if(a) pd(a); if(b) pd(b);
  96. if(fix[a]<fix[b]){
  97. son[a][1]=merge(son[a][1],b);
  98. pu(a);
  99. return a;
  100. }else{
  101. son[b][0]=merge(a,son[b][0]);
  102. pu(b);
  103. return b;
  104. }
  105. }
  106. void insert(int pos,int v){
  107. int a,b,t=node(v);
  108. split(root,pos,a,b);
  109. root=merge(merge(a,t),b);
  110. }
  111. int get(int pos){
  112. int a,b,x,y;
  113. split(root,pos-1,a,b);
  114. split(b,1,x,y);
  115. int t=x;
  116. root=merge(a,merge(x,y));
  117. return t;
  118. }
  119. void rev_append(int pos,int len){//[pos,pos+len-1]
  120. int a,b,x,y;
  121. split(root,pos-1,a,b);
  122. split(b,len,x,y);
  123. rev(x);
  124. root=merge(merge(a,y),x);
  125. }
  126. }tp;
  127. int main(){
  128. int n,m;
  129. while(cin>>n>>m){
  130. tp.init();
  131. rep(i,1,n) tp.insert(i,i);
  132. rep(i,1,m){
  133. int l=read();
  134. int r=read();
  135. tp.rev_append(l,r-l+1);
  136. }
  137. rep(i,1,n){
  138. int pos=tp.get(i);
  139. println(tp.val[pos]);
  140. }
  141. }
  142. return 0;
  143. }

UVA - 11922 区间反转+拼接 可持久化Treap的更多相关文章

  1. UVA - 12538 Version Controlled IDE (可持久化treap)

    紫薯例题 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],ch[ ...

  2. Codeforces - 38G 可持久化Treap 区间操作

    题意:\(n\)个人排队,每个人有重要度\(p\)和不要脸度\(c\),如果第\(i\)个人的重要度大于第\(i-1\)个人的重要度,那么他们之间可以交换,不要脸度-1,交换后先前的第\(i\)个人也 ...

  3. 算法模板——splay区间反转 2

    实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...

  4. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

  5. 可持久化Treap

    终于写了一次可持久化Treap,做的是可持久化序列的模板题. Treap Treap=Tree+Heap,是一个随机化的数据结构.它的每个节点至少有两个关键字,一个是我们要存储的\(val\),一个是 ...

  6. 可持久化treap(FHQ treap)

    FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值 ...

  7. 平衡树与可持久化treap

    平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强 ...

  8. hdu1890 伸展树(区间反转)

    对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交 ...

  9. UVALive 6145 Version Controlled IDE(可持久化treap、rope)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

随机推荐

  1. 521. Longest Uncommon Subsequence I 最长不同子数组

    [抄题]: [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: [一句话思路]: 两个单词的话,就是看谁 ...

  2. 125. Valid Palindrome判断有效的有符号的回文串

    [抄题]: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...

  3. mybatis spring 框架整合

    driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test user=LF password=LF <?xml versi ...

  4. Docker学习笔记_安装和使用Rabbitmq

    一.准备 1.宿主机OS:Win10 64bit 2.虚拟机OS:Ubuntu18.04 3.账号:docker 4.虚拟机IP:192.168.8.25 二.安装 1.搜索镜像            ...

  5. 在CentOS7.5里安装FTP服务器

    安装了一台CentOS7.5,字符界面,为方便上传文件到这台机器上,拟采用FTP服务上传和下载文件,在CentOS上搭建vsftpd服务环境. 记录我的安装过程,供有需要的人参考. 一.系统环境 1. ...

  6. Deepin 2014.2正式版发布 - 自由·独特·前卫

    感谢 deepin 的投递 deepin致力于为全球用户提供美观易用.安全可靠的Linux系统. deepin系统使用基于HTML5技术开发的深度桌面环境,搭配深度音乐.深度影院.WPS和搜狗输入法等 ...

  7. ubuntu16.04 ARM平台移植xmlrpc-c1.39.12

    1. xmlrpc-c依赖与libcurl 参考另外一篇随笔:https://www.cnblogs.com/flyinggod/p/10148228.html 2. 下载源代码 http://xml ...

  8. 26.COUNT() 函数

    COUNT() 函数返回匹配指定条件的行数. SQL COUNT() 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  9. ensemble 的2篇入门 文章

    python 篇: http://machinelearningmastery.com/ensemble-machine-learning-algorithms-python-scikit-learn ...

  10. php系统常量

    (1)__FILE__ :php程序文件名.它可以帮助我们获取当前文件在服务器的物理位置. (2)__LINE__ :PHP程序文件行数.它可以告诉我们,当前代码在第几行. (3)PHP_VERSIO ...