Luogu 1177 - 【模板】快速排序 - [快速排序][归并排序][无旋Treap]
题目链接:https://www.luogu.org/problemnew/show/P1177
题意:输入 $n$ 以及后续 $n$ 个整数,让你将这 $n$ 个整数从小到大排序输出。
归并排序(用时: 121ms / 内存: 1568KB):
#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int n,a[maxn],t[maxn];
void Merge(int l,int m,int r)
{
int i=l,j=m+;
int k=l;
while(i<=m && j<=r)
{
if(a[i]>a[j]) t[k++]=a[j++];
else t[k++]=a[i++];
}
while(i<=m) t[k++]=a[i++];
while(j<=r) t[k++]=a[j++];
for(int i=l;i<=r;i++) a[i]=t[i];
}
void MergeSort(int l,int r)
{
if(l<r)
{
int m=(l+r)>>;
MergeSort(l,m);
MergeSort(m+,r);
Merge(l,m,r);
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
MergeSort(,n);
for(int i=;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ');
}
快速排序(用时: 117ms / 内存: 1040KB):
#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int n,a[maxn];
void QuickSort(int l,int r)
{
int i=l, j=r, p=a[rand()%(r-l+)+l];
while(i<=j)
{
while(a[i]<p) i++;
while(a[j]>p) j--;
if(i<=j) swap(a[i],a[j]), i++, j--;
}
if(l<j) QuickSort(l,j);
if(i<r) QuickSort(i,r);
}
int main()
{
srand(); scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
QuickSort(,n);
for(int i=;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ');
}
(很久以前的https://www.cnblogs.com/dilthey/p/6804152.html这篇随笔里写的快排,选最后一个元素做pivot被卡了QAQ,换一个)
FHQ-Treap(用时: 260ms / 内存: 2824KB):
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+; /******************************** FHQ Treap - st ********************************/
int root,nodecnt;
int ch[maxn][];
int key[maxn],dat[maxn];
int siz[maxn];
int NewNode(int val)
{
int x=++nodecnt;
key[x]=val, dat[x]=rand();
siz[x]=, ch[x][]=ch[x][]=;
return x;
}
void Pushup(int x) {
siz[x]=siz[ch[x][]]+siz[ch[x][]]+;
}
void Init()
{
root=nodecnt=;
key[]=dat[]=;
siz[]=, ch[][]=ch[][]=;
}
void Split(int x,int k,int &a,int &b)
{
if(x==)
{
a=b=;
return;
}
if(key[x]<=k) a=x, Split(ch[x][],k,ch[a][],b);
else b=x, Split(ch[x][],k,a,ch[b][]);
Pushup(x);
}
void Merge(int &x,int a,int b)
{
if(a== || b==)
{
x=a+b;
return;
}
if(dat[a]<dat[b]) x=a, Merge(ch[x][],ch[a][],b);
else x=b, Merge(ch[x][],a,ch[b][]);
Pushup(x);
}
/******************************** FHQ Treap - ed ********************************/ void Insert(int val)
{
int a=,b=;
Split(root,val,a,b);
Merge(a,a,NewNode(val));
Merge(root,a,b);
}
void Inorder(int rt)
{
if(rt==) return;
Inorder(ch[rt][]);
printf("%d ",key[rt]);
Inorder(ch[rt][]);
} int main()
{
int n;
scanf("%d",&n);
for(int i=,x;i<=n;i++)
{
scanf("%d",&x);
Insert(x);
}
Inorder(root);
}
(FHQ-Treap真是好写又好用QAQ!)
Luogu 1177 - 【模板】快速排序 - [快速排序][归并排序][无旋Treap]的更多相关文章
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 洛谷 - P4567 - 文本编辑器 - 无旋Treap
https://www.luogu.org/problem/P4567 事实证明无旋Treap是不是不可能会比Splay快? #include<bits/stdc++.h> using n ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- HNOI2012 永无乡 无旋Treap
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
随机推荐
- Pilosa文档翻译(一)导言、安装
目录 导言 安装 安装在MacOS 使用HomeBrew 下载二进制文件 从源码构建 使用Docker 安装在Linux 下载二进制文件 从源码构建 使用Docker 接下来是什么? 导言 原文地址 ...
- The module is an Android project without build variants, and cannot be built
导入 安卓项目报错 Error:The module 'app' is an Android project without build variants, and cannot be built. ...
- MySQL字符集不一致的解决办法总结
用SHOW CREATE TABLE table_name;可以看出具体的字符集设置. 错误代码: Illegal mix of collations (utf8mb4_unicode_ci,IMPL ...
- [k8s]debug模式启动集群&k8s常见报错集合(on the fly)
debug模式启动-支持sa 集群内(pod访问api)使用443加密 no1 no2 安装flanneld kubelet/kube-proxy m1 安装etcd/ api/contruller/ ...
- SQL获取当前时间月份为两位数
--获取当前时间月份为两位数 )),) --获取当前时间上月月份为两位数 , )),)
- 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇
[原创 深度学习与TensorFlow 动手实践系列 - 3]第三课:卷积神经网络 - 基础篇 提纲: 1. 链式反向梯度传到 2. 卷积神经网络 - 卷积层 3. 卷积神经网络 - 功能层 4. 实 ...
- 【原创 Hadoop&Spark 动手实践 1】Hadoop2.7.3 安装部署实践
目录: 第一部分:操作系统准备工作: 1. 安装部署CentOS7.3 1611 2. CentOS7软件安装(net-tools, wget, vim等) 3. 更新CentOS7的Yum源,更新软 ...
- C# 参数签名字符串按 ASCII码排序,注意其中的坑
参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...
- Socket端口复用
在网络应用中(如Java Socket Server),当服务关掉立马重启时,很多时候会提示端口仍被占用(因端口上有处于TIME_WAIT的连接).此时可通过 SO_REUSEADDR 参数( soc ...
- springboot-multisource
项目中经常会出现需要同时连接两个数据源的情况,这里基于MyBatis来配置两个数据源,并演示如何切换不同的数据源. 通过自定义注解+AOP的方式,来简化这种数据源的切换操作. <properti ...