C 排序

题意

给一个\(1\sim n(n\le 10^6)\)排列,求这个排列用冒泡排序从小到大排序的第\(cnt\)步的状态。这里步的定义为,比较一次算一步。


贴个我看的不是很懂的题解,嗯不是很懂里面01到底咋玩了,如果有理解的比较清楚的教教我这个菜鸡吧。

说一下我自己的想法吧。

还是一轮一轮来,把\(p_i=i\)放好一次算一轮,先把整轮的给移动好

每一次把\(a_j=i\)放到\(i\)这个位置后,实际上是把\(a_i\)这个元素放到了右边第一个比\(a_i\)小的元素\(a_k\)的位置,然后\(a_k\)右边第一个比它小的...一直到\(a_j\),转了一个圈圈。

然后我们考虑对这个操作做一个延迟,比如当前我们处理到\(i\)了。

如果\(i\)这个地方还需要被放好成\(p_i=i\),那么原来位置\(p\)的东西就被顶出去了,它肯定是被顶到第一个比Ta小的地方了,当然Ta在之后也可能被顶,然后我们先把这个值给放到存着准备去顶别人。

然后如果这个地方没啥要求,就看这块地有没有人要了,容易发现越大的值越能顶别人,那么加上原来这个位置上的值中取一个最大的占领这个地方。

可以很简单的拿一个堆维护。

不过因为是排列,所以有个更加优秀的\(O(n)\)做法

考虑到大的东西牛逼,别人顶不动,先把前面的\(a_i=i\)安排好,然后开始安排大的。

如果当前的位置不可用,肯定是安排好了或者被前面的大的顶了,那么就直接往后找一个没被顶的位置,把东西顶走就行了。


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
const int N=1e6+10;
int pos[N],a[N],b[N],is[N];
int main()
{
int n;ll cnt;scanf("%d%lld",&n,&cnt);
for(int i=1;i<=n;i++) scanf("%d",a+i),pos[a[i]]=i;
int k=0;
while(cnt>=n-k-1) cnt=cnt-(n-++k);
for(int i=1;i<=k;i++) is[i]=1,b[i]=i;
int p=k+1;
for(int i=n;i>k;i--)
{
int q=pos[i];
if(is[q])
{
while(is[p]) ++p;
q=p;
}
is[q]=1;
b[q]=i;
}
for(int i=k+2;i<=n&&cnt;i++,--cnt) if(b[k+1]>b[i]) std::swap(b[k+1],b[i]);
for(int i=1;i<=n;i++) printf("%d ",b[i]);
return 0;
}

2019.1.9

C 排序 解题报告的更多相关文章

  1. 【九度OJ】题目1023:EXCEL排序 解题报告

    [九度OJ]题目1023:EXCEL排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1023 题目描述: E ...

  2. 【九度OJ】题目1185:特殊排序 解题报告

    [九度OJ]题目1185:特殊排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1185 题目描述: 输入一系 ...

  3. 【九度OJ】题目1061:成绩排序 解题报告

    [九度OJ]题目1061:成绩排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1061 题目描述: 有N个学 ...

  4. 【九度OJ】题目1202:排序 解题报告

    [九度OJ]题目1202:排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个 ...

  5. 【九度OJ】题目1190:大整数排序 解题报告

    [九度OJ]题目1190:大整数排序 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1190 题目描述: 对N个长度最长可达 ...

  6. 【九度OJ】题目1196:成绩排序 解题报告

    [九度OJ]题目1196:成绩排序 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1196 题目描述: 用一维数组存储学号和成绩,然后 ...

  7. BZOJ 3990 [SDOI 2015] 排序 解题报告

    这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...

  8. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  9. [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)

    题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...

随机推荐

  1. 20155323刘威良《网络对抗》Exp4 恶意代码分析

    20155323刘威良<网络对抗>Exp4 恶意代码分析 实践目标 1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...

  2. maven常用命令集

    maven常用命令 mvn compile  编译主程序源代码,不会编译test目录的源代码.第一次运行时,会下载相关的依赖包,可能会比较费时间. mvn test-compile  编译测试代码,c ...

  3. 【中间件】Redis 实战之主从复制、高可用、分布式

    目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...

  4. 9、Dockerfile实战-Nginx

    上一节我们详解Dockerfile之后,现在来进行实战.我们通过docker build来进行镜像制作. build有如下选项: [root@localhost ~a]# docker build - ...

  5. stl源码剖析 详细学习笔记 算法(5)

    //---------------------------15/04/01---------------------------- //inplace_merge(要求有序) template< ...

  6. 初级字典树查找在 Emoji、关键字检索上的运用 Part-3

    系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 生产实践 我们最终要解决 Emoji 在浏览器和打印物上的显示一致. 进行了多番对比,,在显示效果和精度上,m ...

  7. Linux shell(5)

    shell程序流程控制的三大结构: 1. 顺序结构 2.选择结构 3.循环结构 顺序结构的定义: 顺序结构的程序设计是最简单的一种结构,它的执行顺序自上而下,依次执行,因此,我们只要按照解决问题的思路 ...

  8. 调试OV2735总结

    调试找到的问题: 1:开始调试的时候因为之前的工程师原理图和BOM出错,导致本来是2.8V电压的焊接的是1.8V的LDO所以这个是第一个问题 2:因为FAE反应说sensor没有反应I2C没有通信,所 ...

  9. 从头到尾谈一下HTTPS

    引言 “你能谈一下HTTPS吗?” “一种比HTTP安全的协议.” “...” 如果面试这样说的话那差不多就gg了,其实HTTPS要展开回答的话内容还挺丰富的.本篇文章详细介绍了HTTPS是什么.为什 ...

  10. 解决coursera无法观看视频的问题

    问题 最近开始看coursera的一个课程,遇到一个问题,可以正常登录网站(未使用VPN),也可以下载资源(除了视频)但是却没有办法在线观看视频. 解决方法 使用VPN 这个方法应该可以解决任何访问国 ...