复习一波splay算法。

先来一道模板题,多开两个哨兵节点便于我们将l-1转到根上,r+1转到l-1的右子树上,这样反转的区间就是根的右子树的左子树。

类似线段树开懒标记,每次操作复杂度O(logN)

By:大奕哥

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 struct node
 5 {
 6     int l,r,s,f,lz;
 7 }t[N];
 8 int n,m,rt;
 9 void merge(int x)
10 {
11     t[x].s=t[t[x].l].s+t[t[x].r].s+1;
12 }
13 void build(int l,int r,int x)
14 {
15     if(l>r)return;
16     int mid=l+r>>1;t[mid].f=x;
17     if(mid<x)t[x].l=mid;
18     else t[x].r=mid;
19     if(l==r)
20     {
21         t[l].f=x;
22         t[l].s=1;
23         return;
24     }
25     build(l,mid-1,mid);build(mid+1,r,mid);
26     merge(mid);
27 }
28 void rotate(int x,int &k)
29 {
30     int y=t[x].f,z=t[y].f;
31     if(y==k)k=x;
32     else{
33         if(t[z].l==y)t[z].l=x;else t[z].r=x;
34     }
35     if(t[y].l==x)t[t[x].r].f=y,t[y].l=t[x].r,t[x].r=y;
36     else t[t[x].l].f=y,t[y].r=t[x].l,t[x].l=y;
37     t[y].f=x;t[x].f=z;
38     merge(y);merge(x);
39     return;
40 }
41 void splay(int x,int &k)
42 {
43     while(x!=k)
44     {
45         int y=t[x].f;int z=t[y].f;
46 //        cout<<x<<"  "<<k<<"  "<<y<<"  "<<z<<endl;system("pause");
47         if(y!=k){
48             if(t[y].l==x^t[z].l==y)rotate(x,k);
49             else rotate(y,k);
50         }
51         rotate(x,k);
52     }
53 }
54 void pd(int x)
55 {
56     if(t[x].lz)
57     {
58         swap(t[x].l,t[x].r);
59         t[t[x].l].lz^=1;t[t[x].r].lz^=1;t[x].lz^=1;
60     }
61 }
62 int find(int x,int w)
63 {
64     pd(x);
65     if(t[t[x].l].s+1==w)return x;
66     if(w<=t[t[x].l].s)return find(t[x].l,w);
67     else return find(t[x].r,w-t[t[x].l].s-1);
68 }
69 void write(int x)
70 {
71     if(!x)return;
72     pd(x);
73     write(t[x].l);
74     if(x>1&&x<n+2)printf("%d ",x-1);
75     write(t[x].r);
76     return;
77 }
78 int main()
79 {
80     scanf("%d%d",&n,&m);
81     build(1,n+2,0);int l,r;rt=(n+3)>>1;
82     for(int i=1;i<=m;++i)
83     {
84         scanf("%d%d",&l,&r);
85         int L=find(rt,l);int R=find(rt,r+2);
86         splay(L,rt);splay(R,t[L].r);
87         t[t[R].l].lz^=1;
88     }
89     write(rt);
90     return 0;
91 }

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8278658.html

BZOJ3223 文艺平衡树相关推荐

  1. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  2. BZOJ 3223 文艺平衡树

    BZOJ 3223 文艺平衡树 题意 一个 1~n 的序列,有m次询问,每次询问翻转其中的一个区间.输出最后的区间. 题解 这是一棵加lazy的平衡树-- 首先,翻转区间可以通过区间内所有节点的左右儿 ...

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

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

  4. [Tyvj 1729] 文艺平衡树

    题面如下: Tyvj 1729 文艺平衡树 Time Limit: 1 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个有 ...

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

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

  6. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

  7. P5055 【模板】可持久化文艺平衡树

    P5055 [模板]可持久化文艺平衡树 突然发现fhq_treap也是可以支持区间翻转的,所以基本上和其他平衡树是一样的,而且还满足重量平衡树的性质,真是太优秀了,只不过常数稍微比较大. 然后这里我们 ...

  8. 【Splay】文艺平衡树(金牌导航 Splay-2)

    #文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列 输入样例 5 3 1 3 1 3 1 4 输出样例 4 3 2 1 5 数据范围 ...

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

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

  10. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

最新文章

  1. 玩远程 可视对讲系统几大新兴应用分析
  2. 最近阅读20171106
  3. java for的增强_Java基础之增强for循环
  4. eclipse警告与报错的修复
  5. java重绘table_java – 与JTable交互,使用新行快速更新
  6. C#语言学习--基础部分(十三)枚举类型和结构体
  7. np.memmap读取大文件
  8. 受 SQLite 多年青睐,C 语言到底好在哪儿? 1
  9. googlemap 两点间平滑移动_Salomon萨洛蒙徒步登山鞋实测,一双在山林与城市间探索的户外鞋...
  10. 音标与字母发音不同的字母总结
  11. Oracle创建新用户一系列操作模板
  12. 下载Chrome浏览器历史版本方法
  13. 如何获取Python字符串长度?
  14. 基于matlab的gmsk,基于matlab的GMSK综合实训
  15. Android 开发,你遇上 Emoji 头疼吗?
  16. 千方百剂显示服务器错误,千方百剂远程服务器地址
  17. 机器学习库Scikit-Learn(线性模型、岭回归、插入一列数据(insert)、提取所需列、向量机(SVM)、聚类)
  18. 0811 iOS开发完整学习路线
  19. zbb20180913 java thread volatile与synchronized区别
  20. cesium常见操作:鼠标点击获取对象

热门文章

  1. Lintcode14 First Position of Target Solution 题解
  2. innodb_lru_scan_depth
  3. 关于NGINX变量的一些测试结果
  4. Web Uploader文件上传插件
  5. ListView可拖拽item的原理
  6. PowerShell管理SCOM_批量设置维护模式(上 )
  7. 大量用户升级iPhone3.0系统导致苹果服务器故障
  8. BlogEngine.Net架构与源代码分析系列索引贴
  9. 如何让你的硬盘更快,系统更稳定!
  10. 数据库MySQL/mariadb知识点——操作篇(4)数据操作语句