洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)
时间:2022-05-08
本文章向大家介绍洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap),主要内容包括题目背景、题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目背景
这是一道经典的Splay模板题——文艺平衡树。
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
输入输出格式
输入格式:
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2, cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数
接下来m行每行两个数 [l,r][l,r] 数据保证 1 leq l leq r leq n1≤l≤r≤n
输出格式:
输出一行n个数字,表示原始序列经过m次变换后的结果
输入输出样例
输入样例#1:
5 3
1 3
1 3
1 4
输出样例#1:
4 3 2 1 5
说明
n, m leq 100000n,m≤100000
FHQ无敌,
解决区间问题的时候按照r分成两个
再按照l分成两个
那么我们就得到了需要翻转的区间
然后愉快的打标记就好啦
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<ctime>
5 #include<cstdlib>
6 using namespace std;
7 #define ls T[now].ch[0]
8 #define rs T[now].ch[1]
9 const int MAXN=1e6+10;
10 inline char nc()
11 {
12 static char buf[MAXN],*p1=buf,*p2=buf;
13 return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
14 }
15 inline int read()
16 {
17 char c=nc();int x=0,f=1;
18 while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
19 while(c>='0'&&c<='9'){x=x*10+c-'0',c=nc();}
20 return x*f;
21 }
22 struct node
23 {
24 int ch[2],val,siz,pri,mark;
25 }T[MAXN];
26 int tot=0;
27 int x,y,z,root=0,n,m;
28 int newnode(int v)
29 {
30 T[++tot].siz=1;
31 T[tot].val=v;
32 T[tot].pri=rand();
33 return tot;
34 }
35 void update(int now)
36 {
37 T[now].siz=T[ls].siz+T[rs].siz+1;
38 }
39 int Build(int l,int r)
40 {
41 if(l>r) return 0;
42 int mid=(l+r)>>1;
43 int now=newnode(mid-1);
44 ls=Build(l,mid-1);
45 rs=Build(mid+1,r);
46 update(now);
47 return now;
48 }
49 void pushdown(int now)
50 {
51 if(T[now].mark&&now)
52 {
53 swap(ls,rs);
54 if(ls) T[ls].mark^=1;
55 if(rs) T[rs].mark^=1;
56 T[now].mark=0;
57 }
58 }
59 void split(int now,int k,int &x,int &y)
60 {
61 if(!now) {x=y=0;return ;}
62 pushdown(now);
63 if(T[ls].siz<k)
64 x=now,split(rs,k-T[ls].siz-1,rs,y);
65 else
66 y=now,split(ls,k,x,ls);
67 update(now);
68 }
69 int merge(int x,int y)
70 {
71 if(!x||!y) return x+y;
72 pushdown(x);pushdown(y);
73 if(T[x].pri<T[y].pri)
74 {
75 T[x].ch[1]=merge(T[x].ch[1],y);
76 update(x);
77 return x;
78 }
79 else
80 {
81 T[y].ch[0]=merge(x,T[y].ch[0]);
82 update(y);
83 return y;
84 }
85 }
86 void dfs(int now)
87 {
88 pushdown(now);
89 if(T[now].ch[0]) dfs(T[now].ch[0]);
90 if(T[now].val>=1&&T[now].val<=n) printf("%d ",T[now].val);
91 if(T[now].ch[1]) dfs(T[now].ch[1]);
92 }
93 int main()
94 {
95 #ifdef WIN32
96 freopen("a.in","r",stdin);
97 #else
98 #endif
99 //srand((unsigned)time(NULL));
100 n=read(),m=read();
101 root=Build(1,n+2);
102 while(m--)
103 {
104 int l=read(),r=read();
105 int a,b,c,d;
106 split(root,r+1,a,b);
107 split(a,l,c,d);
108 T[d].mark^=1;
109 root=merge( merge(c,d) ,b );
110 }
111 dfs(root);
112 return 0;
113 }
- 逆向APK进行smali注入实现“秒破WIFI”
- 我所理解的Android 启动模式
- 搭建开源入侵检测系统Snort,并实现与防火墙联动
- 如何在Python中为长短期记忆网络扩展数据
- android 开发Handler源码剖析
- Keras作为TensorFlow的简化界面:教程
- Android基础:Fragment,看这篇就够了
- Rest api简介
- crossdomain.xml文件配置不当利用手法
- Android 常用的ORM框架详解
- 测试全球最安全的手机Blackphone
- 国产SSL防火墙 – sslfw
- Android 之dragger使用
- Android图像处理 - 高斯模糊的原理及实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 布隆过滤器(bloom filter)及php和redis实现布隆过滤器的方法
- PHP使用反向Ajax技术实现在线客服系统详解
- PHP设计模式之适配器模式(Adapter)原理与用法详解
- laravel5.5框架的上传图片功能实例分析【仅传到服务器端】
- Laravel5.1框架自带权限控制系统 ACL用法分析
- php使用filter_var函数判断邮箱,url,ip格式示例
- Python json格式化打印实现过程解析
- PHP使用DOM对XML解析处理操作示例
- OpenCV Python实现图像指定区域裁剪
- Laravel框架实现多个视图共享相同数据的方法详解
- python如何快速生成时间戳
- 从python读取sql的实例方法
- PHP+iframe模拟Ajax上传文件功能示例
- Centos7 Yum安装PHP7.2流程教程详解
- PHP session垃圾回收机制实例分析