noi.ac #32 快速排序归并排序应用
\(des\)
给定长度为 \(n\) 的数组,要求翻转一段区间 \([l, r]\) 使其升序排列。
要求 \(\sum r - l + 1 <= 2e7\)
\(sol\)
考虑快速排序,每次选择一个 \(mid\),把 \(<= mid\) 的数放大左边, \(>= mid\)
的数放到右边,递归下去。
把 \(<= mid\) 的数看做 \(0\), \(>= mid\) 的数看做 \(1\), 就相当于 \(0/1\) 序列排
序,类似归并排序,每次把左右两部分排好序,然后将其合并,对于 \(0/1\) 序列
而言,排好序等价于前面都是 \(0\), 后面都是 \(1\),这样的话,每次将左半边的
\(1\) 和右半边的 \(0\) 进行翻转。
\(code\)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#define N 50005
using namespace std;
int n, a[N], id[N];
void output(int l, int r) {
printf("%d %d\n", l, r);
for(; l < r; l ++, r --) swap(a[l], a[r]);
}
int Msort(int l, int r, int val) {
if(l > r) return 0;
if(l == r) return a[l] < val;
int mid = (l + r) >> 1;
int a = Msort(l , mid , val) , b = Msort(mid + 1 , r , val);
if(l + a <= mid && mid + b <= r && b) output(l + a, mid + b);
return a + b;
}
void Qsort(int l, int r, int L, int R) {
if(l >= r || L > R) return;
int mid = (L + R) >> 1, tmp;
tmp = Msort(l, r, mid);
Qsort(l, l + tmp - 1, L, mid - 1), Qsort(l + tmp, r, mid + 1, R);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
Qsort(1, n, 0, 1000000000);
puts("-1 -1");
return 0;
}
noi.ac #32 快速排序归并排序应用的更多相关文章
- NOI.AC 32 Sort——分治
题目:http://noi.ac/problem/32 从全是0和1的情况入手,可以像线段树一样分治下去,回到本层的时候就是左半部的右边是1,右半部的左边是0,把这两部分换一下就行.代价和时间一样是n ...
- [NOI.AC#32]sort 构造
链接 50分做法(只有0,1) 根据归并排序的思想,假设我们现在已经把 \(l\dots mid\) 和 \(mid+1\dots r\) 排好序 只要把左边连续的1和右边连续的0翻转即可 inlin ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC#2139-选择【斜率优化dp,树状数组】
正题 题目链接:http://noi.ac/problem/2139 题目大意 给出\(n\)个数字的序列\(a_i\).然后选出一个不降子序列最大化子序列的\(a_i\)和减去没有任何一个数被选中的 ...
- configure.ac:32: error: possibly undefined macro: AC_DEFINE
在ubuntu 下编译snappy时,在检查依赖关系时,处理autoconf的包时,在相关依赖包都已经安装的情况下,报如下错误,死活不过. configure.ac:32: error: possib ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
随机推荐
- Xshell连接虚拟机文档教程
1打开VirtualBox 2 找到导入的虚拟机 3右键虚拟机 启动 4 等待加载 5 加载的时候,打开xshell 6 7 填写框住的内容 名称: 自己取 主机: 127.0.0.1 固定内容 端 ...
- redis连接相关命令
命令名称:echo 语法:echo message 功能: 打印一个特定的信息message,测试时使用. 返回值: message自身 命令名称:ping 语法:ping 功能: 使用客户端向red ...
- Maven 的依赖范围
Maven 在编译项目主代码的时候需要使用一套 classpath,在编译和执行测试的时候会使用另外一套 classpath.最后,实际运行 Maven 项目的时候,又会使用一套 classpath. ...
- JS获取时间差
Date.parse(String string)转为毫秒数进行比较
- Java中关于Math的几个取整方法的区别
1.Math.ceil() 向上取整 System.out.println(Math.ceil(3.4)); //输出4 System.out.println(Math.ceil(3.7)); / ...
- 用less查看日志文件
一般程序部署在Linux环境,查看日志时,一般用less满足大部分的需求. 列举.记录最常用的场景,代码以Tomcat日志文件catalna.out为例. 1. > 直接查看文件 less ca ...
- spark源码阅读--SparkContext启动过程
##SparkContext启动过程 基于spark 2.1.0 scala 2.11.8 spark源码的体系结构实在是很庞大,从使用spark-submit脚本提交任务,到向yarn申请容器,启 ...
- HTTP2协议主要改进点
1.改成二进制协议,每次传输二进制帧,帧有以下几个字段 类型type,长度length,flag,StringID流标志,Payload负载,最基础的两种类型HEAD类型和DATA类型 2.多路复用, ...
- vue + elementui 使用多选按钮实现单选功能
CommonRadio.vue <template> <div> <el-checkbox-group v-model="checkList" @ch ...
- NSLog的各种打印格式符和打印CGRect相关结构体
1.打印CG开头的数据类型,如CGRect,CGSize等方法 1.1 打印CGRect : NSLog(@"%@", NSStringFromCGRect(someCGRect) ...