#183. 「2019冬令营提高组」排序

贴一段ppt

考虑模拟出这个算法进行k轮(即外层的i循环到k)时的序列,之后再暴力模拟零散的步。

考虑这个算法在01序列上的表现,k轮后实际上就是将最开始的不超过k个0放到序列开头。

考虑把序列转化成01序列,我们只要从1~n枚举x,然后把<=x的记为0,>x的记为1就行了,新增的那个0就是x的位置。

我们用priority_queue维护序列中当前前k个0的位置,每次考虑新的那个0的位置。

如果它为前k个,那么被弹出去的那个元素就是现在x的位置。如果它不为前k个,那么x的位置保持不变。

因为这题太过神仙我不知道咋讲了,感性理解吧(逃

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
namespace io {
const int SIZE = ( << ) + ;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - , c, qu[]; int f, qr;
// getchar
#define gc() (iS == iT ? (iT = (iS = ibuf) + fread (ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
// print the remaining part
inline void flush () {
fwrite (obuf, , oS - obuf, stdout);
oS = obuf;
}
// putchar
inline void putc (char x) {
*oS ++ = x;
if (oS == oT) flush ();
}
// input a signed integer
template <class I>
inline void gi (I &x) {
for (f = , c = gc(); c < '' || c > ''; c = gc()) if (c == '-') f = -;
for (x = ; c <= '' && c >= ''; c = gc()) x = x * + (c & ); x *= f;
}
// print a signed integer
template <class I>
inline void print (I &x) {
if (!x) putc (''); if (x < ) putc ('-'), x = -x;
while (x) qu[++ qr] = x % + '', x /= ;
while (qr) putc (qu[qr --]);
}
//no need to call flush at the end manually!
struct Flusher_ {~Flusher_(){flush();}}io_flusher_;
}
using io :: gi;
using io :: putc;
using io :: print;//题目附送的快读
using namespace std;
#define N 1000005
priority_queue <int> h;
int n,x,p[N],a[N]; long long k;
void work(int x){
for(int i=;i<=n;++i) p[a[i]]=i;
for(int i=;i<x;++i) a[i]=i,h.push(p[i]);
for(int i=x;i<=n;++i){
if(h.top()<p[i]) a[p[i]]=i;//后面的一段不受影响
else{
a[h.top()]=i;
h.pop(); h.push(p[i]);
}//把i放到最右边的位置上
}
}
int main(){
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
gi(n);gi(k);
for(int i=;i<=n;++i) gi(a[i]);
for(int i=;i<=n;++i){
if(k>n-i) k-=n-i;
else{
if(i>) work(i);
for(int j=i+;j<=i+k;++j)//模拟零散步
if(a[j]<a[i]) swap(a[i],a[j]);
for(int j=;j<=n;++j) print(a[j]),putc(' ');
return ;
}
}
}

fjwc2019 D2T3 排序(堆)的更多相关文章

  1. hihoCoder 1391 Countries 【预处理+排序+堆】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1391 : Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, countr ...

  2. 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆

    题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...

  3. 洛谷P4165 [SCOI2007]组队(排序 堆)

    题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...

  4. [AGC010E] Rearranging [拓扑排序+堆]

    题面 传送门 思路 首先,一个显然的结论是:Alice调整过后的序列中任意两个不互质的数的相对顺序无法改变 那么我们可以以这个性质为突破口 我们在两个不互质的权值的点之间连一条边(没错这是个图论题!! ...

  5. BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...

  6. BZOJ3832: [Poi2014]Rally(拓扑排序 堆)

    题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...

  7. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】

    有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...

  8. c++堆

    c++ reference: http://www.cplusplus.com/reference/algorithm/make_heap/ heap并不属于STL容器组件,它分为 max heap ...

  9. hihoCoder 1391 Countries【预处理+排序+优先队列】2016北京网络赛

    题目:http://hihocoder.com/problemset/problem/1391 题目大意: A和B两个国家互射导弹,每个国家都有一个防御系统,在防御系统开启的时间内可以将到达本国的导弹 ...

随机推荐

  1. 通过socket实现http通讯代码理解

    1.首先构造http协议报头: String dd = "GET http://www.baidu.com HTTP/1.1" + "\r\n" + " ...

  2. [LeetCode] 762. Prime Number of Set Bits in Binary Representation_Easy

    Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime ...

  3. iOS 点击返回键崩溃的未解之谜

    1. iOS8出现. 2.点击进去下一层View,然后返回,再返回上一级的视图的时候奔溃. 3.只有点击进去一下层View的时候才出现. 4. 报错的是给一个未知对象发送这个消息 gestureRec ...

  4. php 实现php代码的加密解密

    php 代码加密类,大家可以根据自己的需求进行修改,原类如下,是对之前的加密解密类的有一次修改,希望能分享给大家.本次在ubuntu下测试没有问题,与之前的版本的区别在于,这次的版本更加的通用性. & ...

  5. Elasticsearch集群监控工具bigdesk插件安装

    bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况,http连接数等. 项目git地址: https://g ...

  6. 如何学Python

    如何学习Python? Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.它们包括:1.常用内置类型(int, float, bool, bytes, st ...

  7. centos 6.x下编译dpdk 16.7 心得

    之前对dpdk编译了解得较少,之前直接就把centos yum update了,造成测试经理部署的centos 6.5升级为6.9,造成dpdk编译出错. 先说说centos 6.9下编译的心得: 1 ...

  8. python timeit

    //有时候,我们想知道一个函数的计算耗时,那么,你可以用timeit //test.py 1 import timeit 2 3 def func(): 4         s = 0 5       ...

  9. python SMTP other

    HTML 正文,带链接和图片 //test.py import smtplib from email.mime.image import MIMEImage from email.mime.text ...

  10. iOS 图文混排

    使用系统自带的NSAttributedString来处理,对于一般的图文混排已经足够了,但是,有一个缺点就是NSAttributedString并不支持gif动画.实际上,使用gif动画还是挺卡的. ...