链接

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 构造的更多相关文章

  1. NOI.AC 32 Sort——分治

    题目:http://noi.ac/problem/32 从全是0和1的情况入手,可以像线段树一样分治下去,回到本层的时候就是左半部的右边是1,右半部的左边是0,把这两部分换一下就行.代价和时间一样是n ...

  2. noi.ac day1t3 Sort

    传送门 分析 快排的原理是以任意一个数为标准,然后把所有小于它的数换到它的左边,所有大于它的数换到它的右边.我们就使用快排的思路,分治整个区间.对于每个区间以排好序的这个数列的中间位置的值为标准,然后 ...

  3. noi.ac #32 快速排序归并排序应用

    \(des\) 给定长度为 \(n\) 的数组,要求翻转一段区间 \([l, r]\) 使其升序排列. 要求 \(\sum r - l + 1 <= 2e7\) \(sol\) 考虑快速排序,每 ...

  4. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  5. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  6. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  7. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  8. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  9. noi.ac上的一套(假)NOI题

    noi.ac上的一套(假)NOI题 本来想着可以刷点通过量的,结果发现好像并不是这样的. 整数 description 给你\(n,p\),要你求\(\sum_{k=1}^n\sum_{i=1}^k\ ...

随机推荐

  1. Android获取系统时间的多种方法

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现. 现总结如下: 方法一: ? 1 2 3 4 5 ...

  2. Oracle 常见的33个等待事件

    一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指Oracle正等待某种工作,在诊断和优化数据库的时 ...

  3. Java-MyBatis-杂项:MyBatis根据数组、集合查询

    ylbtech-Java-MyBatis-杂项:MyBatis根据数组.集合查询 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的 ...

  4. [Swift]二进制、八进制、十进制、十六进制之间的转换

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. C语言-统计数字、字母、特殊字符

    Action() { //统计字符019aBcd8***,4,4,3 int i,z,t; char *str="019aBcd8***"; fun_Count(str,i,z,t ...

  6. python链接mysql数据库

    1.安装pycharm python3.6    pip 在windows+R  cmd where pip pip install mysql-client 如何看自已mysql-client有没有 ...

  7. IOS - 总结(网络状态变更)

    - (void)initNetworkMonitor { NSURL *baseURL = [NSURL URLWithString:@"http://www.baidu.com/" ...

  8. POST和GET详解

    GET和POST Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上 ...

  9. CF739E Gosha is hunting(费用流,期望)

    根据期望的线性性答案就是捕捉每一只精灵的概率之和. 捕捉一只精灵的方案如下: 1.使用一个\(A\)精灵球,贡献为\(A[i]\) 2.使用一个\(B\)精灵球,贡献为\(B[i]\) 3.使用一个\ ...

  10. splay 文艺平衡树 (数据结构)

    题目大意:略 splay维护区间翻转裸题,为了减少不必要的麻烦,多插入两个点,分别是0和n+1 每次找区间的第K个值,就在splay上二分即可 顺便学了一下splay的完美建树,而且splay有一些小 ...