\(\\\)

\(Description\)


运行以下代码对一长为\(N\)的数列\(A\)排序,不保证数列元素互异:

cnt = 0
sorted = false
while (not sorted):
cnt = cnt + 1
sorted = true
for i = 0 to N-2:
if A[i+1] < A[i]: swap A[i], A[i+1]
for i = N-2 downto 0:
if A[i+1] < A[i]: swap A[i], A[i+1]
for i = 0 to N-2:
if A[i+1] < A[i]: sorted = false

求退出循环后\(cnt\)的值。

  • \(N\in [0,10^5]\),\(A_i\in [0,10^9]\)

\(\\\)

\(Solution\)


  • 求双向冒泡排序操作次数就没有\(silver\)那道题那么简单了,因为向前移动的瓶颈被去掉了,而换做局部的移动限制。

  • 转化问题。设\(t_i\)表示将区间\([1,i]\)变为排序后状态的最少操作次数,那么答案即为\(max\{t_i\}\)。设\(s_i\)为排序后在\([1,i]\)中而原数列里不在\([1,i]\)的元素个数,可以证明\(s_i=t_i\)。因为双向冒泡排序可以保证,每次循环将当前未归位的最大元素和未归位的最小元素归位,所以对于一个没有完成排序的前缀区间,每次会将一个不应在该区间里的元素移出,将一个应该在改区间却原来不在的元素归位。

  • 具体实现可以对下标开树状数组,将排序后的数列按顺序插入每个元素的初始位置,用总个数减前缀和或后缀和的方式查询即可。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
#define R register
#define gc getchar
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} int n,ans=1;
struct seq{int x,p;}s[N]; struct BIT{
int c[N];
inline int lowbit(int x){return x&-x;}
inline void add(int p){for(;p<=n;p+=lowbit(p)) ++c[p];}
inline int sum(int p){
int res=0;
for(;p;p-=lowbit(p)) res+=c[p];
return res;
}
}bit; inline bool cmp(seq x,seq y){
return x.x==y.x?x.p<y.p:x.x<y.x;
} int main(){
n=rd();
for(R int i=1;i<=n;++i){s[i].x=rd();s[i].p=i;}
sort(s+1,s+1+n,cmp);
for(R int i=1;i<=n;++i){
bit.add(s[i].p);
ans=max(ans,i-bit.sum(i));
}
printf("%d\n",ans);
return 0;
}

[ USACO 2018 OPEN ] Out of Sorts (Gold)的更多相关文章

  1. [ USACO 2018 OPEN ] Out of Sorts (Platinum)

    \(\\\) \(Description\) 对一长为\(N\)的数列\(A\)排序,不保证数列元素互异: 数列\(A\)中\(A[1...i]\)的最大值不大于\(A[i+1-N]\)的最小值,我们 ...

  2. [ USACO 2018 OPEN ] Out of Sorts (Silver)

    \(\\\) \(Description\) 运行以下代码对一长为\(N\)的数列\(A\)排序,不保证数列元素互异: cnt = 0 sorted = false while (not sorted ...

  3. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  4. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  5. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...

  6. [USACO 2018 Open Contest]作业总结

    t1-Out of Sorts 题目大意 将最大的数冒泡排序到最后需要多少次操作. 分析 排序后判断距离. ac代码 #include<bits/stdc++.h> #define N 1 ...

  7. [USACO 2018 Open Gold] Tutorial

    Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...

  8. 【杂题1】USACO 2018 Open Contest-练习

    https://www.xoj.red/contests/show/1231 下面会写一些题目的解析什么的,当然不会粘贴题目只是简单提一下 (部分题目简单的题目就不概括了) 其实难度应该前面比较低. ...

  9. [LOJ#2386]. 「USACO 2018.01 Platinum」Cow at Large[点分治]

    题意 题目链接 分析 假设当前的根为 rt ,我们能够在奶牛到达 \(u\) 之时拦住它,当且仅当到叶子节点到 \(u\) 的最短距离 \(mn_u \le dis_u\) .容易发现,合法的区域是许 ...

随机推荐

  1. Android layer-list:联合shape(2)

     Android layer-list:联合shape(2) 附录文章3简单说明了Android layer-list的用法,现在把Android layer-list联合shape做出一些特殊的 ...

  2. 使用ajax,后台传回的数据处理

    使用ajax,后台传到前台的是json数据,但这只是一个字符串的形式,需要进行转换为对象 转换后再使用$.each()方法进行遍历 使用alert(typeof  msg) ;  可以查看msg的类型 ...

  3. ORA-12541:TNS:无监听程序

    安装oracle以后,sql plus可以正常登陆,pl/sql登陆时报错ORA-12541:TNS:无监听程序,解决方案如下: http://blog.csdn.net/hao134838/arti ...

  4. Hihocoder 1337 (splay)

    Problem 平衡树 SBT 题目大意 维护一个序列,支持两种操作. 操作一:插入一个数. 操作二:询问第k小的数. 解题分析 ~~刷刷水题,再熟悉一下splay的基本操作. ps:哇咔咔,有连续四 ...

  5. Vue插槽的另外一些特性

    之前有个项目,想判断一下,某一个模板内的插槽是否被使用. 不知道是不是问题过于简单,网上没有这方面的说明.我就抽时间验证一下vue插槽相关的一些功能. 然后写下这篇随笔,希望对后来人能有一些帮助. 简 ...

  6. java中POJO类和DTO类都要实现序列化

    java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序 ...

  7. Linux Rsync实现文件同步备份(转载)

    原文地址:Linux Rsync实现文件同步备份作者:夷北 转自:http://www.mike.org.cn/blog/index.php?load=read&id=639###pp=0 [ ...

  8. Mysql net start mysql启动,提示发生系统错误 5 拒绝訪问 解决之道

    当前用户的操作权限太低了,出了问题 出错问题截屏例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/4 ...

  9. 自由宣言--《I Have a Dream》(马丁.路德.金)

    I Have a Dream by Martin Luther King, Jr. I am happy to join with you today in what will go down in ...

  10. 具体解释clone函数

    我们都知道linux中创建新进程是系统调用fork,但实际上fork是clone功能的一部分,clone和fork的主要差别是传递了几个參数.clone隶属于libc.它的意义就是实现线程. 看一下c ...