[NOI.AC#32]sort 构造
50分做法(只有0,1)
根据归并排序的思想,假设我们现在已经把 \(l\dots mid\) 和 \(mid+1\dots r\) 排好序
只要把左边连续的1和右边连续的0翻转即可
inline bool check(int l,int r){REP(i,l+1,r)if(a[i-1]>a[i])return 0;return 1;}
inline void reverse_sort(int l,int r){
if(check(l,r))return;
int mid=l+r>>1,p=l,q=r;
reverse_sort(l,mid),reverse_sort(mid+1,r);
while(p<=mid&&!a[p])++p;
while(q>mid&&a[q])--q;
if(p<=mid&&q>mid)printf("%d %d\n",p,q),reverse(a+p,a+q+1);
}
100分做法
回忆一下快排(下面是我1年前写的随机快排):
void qsort(int l,int r){
int mid=a[l+rand()%(r-l+1)],x=l,y=r;
do{
while(a[x]<mid)++x;
while(a[y]>mid)--y;
if(x<=y){
int temp=a[x];
a[x]=a[y];
a[y]=temp;
++x;--y;
}
}
while(x<=y);
if(x<r)qsort(x,r);
if(y>l)qsort(l,y);
}
快排时,先找一个基准点 \(mid\) ,把大于 \(mid\) 的放到右边,小于等于 \(mid\) 的放到左边
利用这个和刚刚只有0/1的归并排序思路
我们找基准点 \(mid\) 之后,把小于等于 \(mid\) 的数当做0 把大于 \(mid\) 的数当做1 做上面的归并排序,就可以实现大于 \(mid\) 的放到右边,小于等于 \(mid\) 的放到左边 ,和快速排序一样
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int>pii;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
const int N=5e4+5;
int n,a[N];
inline bool check(int l,int r){REP(i,l+1,r)if(a[i-1]>a[i])return 0;return 1;}
void reverse_sort(int l,int r,int x){
if(l==r)return;
int mid=l+r>>1,p=l,q=r;
reverse_sort(l,mid,x),reverse_sort(mid+1,r,x);
while(p<=mid&&a[p]<=x)++p;
while(q>mid&&a[q]>x)--q;
if(p<=mid&&q>mid)printf("%d %d\n",p,q),reverse(a+p,a+q+1);
}
void solve(int l,int r){
if(check(l,r))return;
int x=a[l+rand()%(r-l+1)];
reverse_sort(l,r,x);
REP(i,l,r)if(a[i]>x)return solve(l,i-1),solve(i,r);
solve(l,r);
}
int main(){
srand(19260817);
n=read();
REP(i,1,n)a[i]=read();
solve(1,n);puts("-1 -1");
return 0;
}
[NOI.AC#32]sort 构造的更多相关文章
- NOI.AC 32 Sort——分治
题目:http://noi.ac/problem/32 从全是0和1的情况入手,可以像线段树一样分治下去,回到本层的时候就是左半部的右边是1,右半部的左边是0,把这两部分换一下就行.代价和时间一样是n ...
- noi.ac day1t3 Sort
传送门 分析 快排的原理是以任意一个数为标准,然后把所有小于它的数换到它的左边,所有大于它的数换到它的右边.我们就使用快排的思路,分治整个区间.对于每个区间以排好序的这个数列的中间位置的值为标准,然后 ...
- noi.ac #32 快速排序归并排序应用
\(des\) 给定长度为 \(n\) 的数组,要求翻转一段区间 \([l, r]\) 使其升序排列. 要求 \(\sum r - l + 1 <= 2e7\) \(sol\) 考虑快速排序,每 ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- 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)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- noi.ac上的一套(假)NOI题
noi.ac上的一套(假)NOI题 本来想着可以刷点通过量的,结果发现好像并不是这样的. 整数 description 给你\(n,p\),要你求\(\sum_{k=1}^n\sum_{i=1}^k\ ...
随机推荐
- poj--3169--Layout(简单差分约束)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9098 Accepted: 4347 Descriptio ...
- [POJ 2279] Mr. Young's Picture Permutations
[题目链接] http://poj.org/problem?id=2279 [算法] 杨氏矩阵与勾长公式 [代码] #include <algorithm> #include <bi ...
- 洛谷P3704 [SDOI2017]数字表格
题目描述 Doris刚刚学习了fibonacci数列.用f[i]f[i] 表示数列的第ii 项,那么 f[0]=0f[0]=0 ,f[1]=1f[1]=1 , f[n]=f[n-1]+f[n-2],n ...
- 关于C语言变量声明在其他语句后的一些细节
今天一个同学来找我,说他的代码老是编译不通过,我看了半天,好像都很符合逻辑,但一直显示一个变量未定义,我就纳闷了,代码类似如下: int main(){ login(); int id; scanf( ...
- Windows环境下配置thrift编译器(VS2015)
参考官方文档:http://svn.apache.org/repos/asf/thrift/attic/trunk/compiler/cpp/README_Windows.txt 编译器( ...
- oracle插入或更新某一个指定列来执行触发器
表结构: create table TZ_GXSX ( ID VARCHAR2(15), PROJECT VARCHAR2(50), TXYX NUMBER(22) default '0', CDAT ...
- 用IIS怎样在局域网内建网站
IIS服务器组建一览 IIS(Internet Information Server,互联网信息服务)是一种Web(网页)服务组件,其中包括Web服务器.FTP服务器.NNTP服务器和SMTP服务器, ...
- 【前端分享】 JavaScript最经典的55个技巧(转)
从别的地方看到的,保存下,有空实践下再补充. 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <tab ...
- ZBrush中如何对模型进行减面操作
Decimation Master是ZBrush 4R8自带的一个插件.中文名叫减面大师.其功能非常强大,也非常的方便,可以帮助我们提高效率,减少电脑资源损耗.作为一名3D美术师是必须掌握的一个技术. ...
- BZOJ 4990 [USACO17FEB] Why Did the Cow Cross the Road II P (树状数组优化DP)
题目大意:给你两个序列,你可以两个序列的点之间连边 要求:1.只能在点权差值不大于4的点之间连边 2.边和边不能相交 3.每个点只能连一次 设表示第一个序列进行到 i,第二个序列进行到 j,最多连的边 ...