C 排序 解题报告
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 排序 解题报告的更多相关文章
- 【九度OJ】题目1023:EXCEL排序 解题报告
[九度OJ]题目1023:EXCEL排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1023 题目描述: E ...
- 【九度OJ】题目1185:特殊排序 解题报告
[九度OJ]题目1185:特殊排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1185 题目描述: 输入一系 ...
- 【九度OJ】题目1061:成绩排序 解题报告
[九度OJ]题目1061:成绩排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1061 题目描述: 有N个学 ...
- 【九度OJ】题目1202:排序 解题报告
[九度OJ]题目1202:排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个 ...
- 【九度OJ】题目1190:大整数排序 解题报告
[九度OJ]题目1190:大整数排序 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1190 题目描述: 对N个长度最长可达 ...
- 【九度OJ】题目1196:成绩排序 解题报告
[九度OJ]题目1196:成绩排序 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1196 题目描述: 用一维数组存储学号和成绩,然后 ...
- BZOJ 3990 [SDOI 2015] 排序 解题报告
这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)
题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...
随机推荐
- c# 限制同时启动多个实例程序运行
using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using S ...
- 20155320 EXP8 Web基础
20155320 EXP8 Web基础 [基础问题回答] 什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单由文本域.复选框.单选框.菜单.文件地址域.按钮等 ...
- vue-cli,build 后,报错的解决办法
报错如下图: 或: 解决办法:config / index.js 中,找到 build { assetsPublicPath: '/' },将其设置为:assetsPublicPath: './ ' ...
- 学会查看Linux手册页(man文档)
区段1:用户指令区段2:系统调用区段3:程序库调用区段4:设备区段5:文件格式区段6:游戏区段7:杂项区段8:系统指令区段9:内核内部指令区段n:Tcl或Tk指令 如果记不清楚工具或者函数的完整名字, ...
- adb连接不上手机的解决方案
一.确认手机的USB调试接口是打开的:----------打开开发者模式,暴击手机版本号多次,直到提示已打开开发者模式. 二.使用USB线连接电脑和手机,可以首先执行adb remount(重新挂载系 ...
- kali黑客渗透测试基础环境准备
1.apt-get install python-nmap 2.apt-get install python-setuptools 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 ...
- REST-framework快速构建API--四部曲
代码目录结构: 一.使用原生APIView 使用rest-framework原生的APIView实现过程: 以url(r'^books/$', views.BookView.as_view(),nam ...
- 【2017年9月10日更新】ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发
ABP代码生成器介绍 ABP Code Generator 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始 ...
- C语言中指针占据内存空间问题
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
- svn插件下载的两种方式
1.下载SVN插件 SVN插件下载地址及更新地址,你根据需要选择你需要的版本.现在最新是1.8.x Links for 1.8.x Release: Eclipse up ...