Description

有这么一则传闻,O(nlogn)的排序发明之前,滋滋国的排序都是采用的冒泡排序。即使是冒泡排序,对当时的国民
来说也太复杂太难以理解,于是滋滋国出现了这样一个职业——排序使,收取报酬并负责给序列排序。作为冒泡协
会首席排序使,Lyra收费颇高,为了照顾并不富裕的人,Lyra允许顾客只支付一部分酬劳并获得并不完美的冒泡排
序服务。众所周知,n个元素的冒泡排序需要n?1n-1轮才能完成,有一位顾客支付的费用,只能够完成前k轮的排序
。作为冒泡排序的首席排序使,天赋卓绝的Lyra暗地里早就掌握了O(nlogn)的排序方法,这也是她轻松当选首席排
序使的原因——排序速度无人能敌。而现在面对只能够完成前k轮冒泡排序的要求,Lyra犯了难,于是她来寻求你
的帮助。给定一个序列,执行如下程序:
for i from 1 to k
    for j from 1 to n-1
         if Aj>Aj+1
            swap(Aj,Aj+1)
 
并输出之后的A序列。

Input

第一行两个整数n,k表示序列的长度和轮数。
接下来n行每行一个整数表示Ai
1≤k<n≤200000;1≤Ai≤10^9

Output

输出n行每行一个整数表示冒泡排序k轮后的Ai

Sample Input

3 1
3
2
1

Sample Output

2
1
3

Solution

我把冒泡的本质想错了...然后就一直写挂样例都过不了

看了zz的题解才发现自己错的好离谱...(orzz)

事实上每次冒泡排序都会把当前数前移一位(如果前面有比它大的数的话)

用树状数组维护当前有几个比它大的

如果比它大的超过$k$个那么直接前移$k$位就好了($k$次都有比当前大的数,移动了$k$位)

最后剩下的位置一位一位地去填,从小到大填

我怎么觉得这题主要难度在于看懂冒泡排序到底怎么做的...(

#include <bits/stdc++.h>

using namespace std ;

#define N 200010
#define lowbit( i ) i&(-i) int ans[ N ] , n , k , rk[ N ] , f[ N ] , c[ N ] ;
struct node {
int val , id ;
}a[ N ] ; //每次冒泡排序都会把当前数前移一位(如果前面有比它大的数的话)
//用树状数组维护当前有几个比它大的
//如果比它大的超过k个那么直接前移k位就好了(k次都有比当前大的数,移动了k位)
//最后剩下的位置一位一位地去填,从小到大填 bool cmp( node a, node b ) {
return a.val < b.val ;
} void add( int x , int val ) {
for( int i = x ; i <= n ; i += lowbit( i ) )
c[ i ] += val ;
} int query( int x ) {
int ans = ;
for( int i = x ; i ; i -= lowbit( i ) ) ans += c[ i ] ;
return ans ;
} int main() {
scanf( "%d%d" , &n , &k ) ;
for( int i = ; i <= n ; i ++ ) {
scanf( "%d" , &a[ i ].val ) ;
a[ i ].id = i ;
}
sort( a + , a + n + , cmp ) ;
rk[ a[ ].id ] = ;
for( int i = ; i <= n ; i ++ ) {
if( a[ i ].val == a[ i - ].val ) rk[ a[ i ].id ] = rk[ a[ i - ].id ] ;
else rk[ a[ i ].id ] = i ;
}
for( int i = ; i <= n ; i ++ ) {
add( rk[ i ] , ) ;
f[ i ] = query( n ) - query( rk[ i ] ) ;
if( f[ i ] > k ) ans[ i - k ] = a[ rk[ i ] ].val ;
}
int cur = ;
for( int i = ; i <= n ; i ++ ) {
if( f[ a[ i ].id ] <= k ) {
while( cur <= n && ans[ cur ] ) cur ++ ;
ans[ cur ] = a[ i ].val ;
}
}
for( int i = ; i <= n ; i ++ ) {
printf( "%d\n" ,ans[ i ] ) ;
}
return ;
}

BZOJ5170: Fable 树状数组的更多相关文章

  1. 【bzoj5170】Fable(树状数组)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5170 我们会发现,经过一轮冒泡后,若a[i]的前面有比它大的数,就一定会有一个被丢到后 ...

  2. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  3. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  4. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  7. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  8. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  9. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

随机推荐

  1. sublime 使用总结

    不管你用什么编辑,sublime是首选编辑器,就是sublime淘汰,但已成为标准.例如:atom,几乎等同于sublime,及其他可以几乎调成到sublime操作方式. 一.常用插件 插件搜索地址: ...

  2. hdu1505City Game(扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1505 题意:R为被占位置,F为空位,求出最大子空矩阵大小*3. 思路:1.悬线法,记录每个位置的悬线能到达的左边 ...

  3. Py-lamda表达式学习【转载】

    转自:https://blog.csdn.net/zjuxsl/article/details/79437563 1.语法定义 在Python中,lambda的语法是唯一的.其形式如下: lambda ...

  4. linux phpize

    phpize是什么 1.phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块. 当php编译完后,在bin下面会有phpize这个脚本文件, 在编译你要添加的扩展模块之前, ...

  5. #C++初学记录(算法考试1)

    B - Maximal Continuous Rest Each day in Berland consists of n hours. Polycarp likes time management. ...

  6. EL—表达式

    El的数据访问操作: 1:获取变量名(四大作用域中的变量?六大作用域?) 只能从这六个区域中拿数据!!! 2:获取对象的属性值 3:获取集合元素 4:执行表达式 1:获取变量名(四大作用域中的变量) ...

  7. Perl的变量及语境(一)

    Perl语言中的大部分语句表达式后都紧接一个分号,分隔不同的Perl语句. perl解释器能一次完成编译和运行这两个动作. perl通过一对反引号"``"来表示运行外部命令. 也可 ...

  8. mongodbtemplate配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. Navicat 连接 Mysql8.0 出现2059问题的解决方法

    ``` 登陆Mysql后执行命令 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; ...

  10. Object-C-内存管理 对象生命周期

    autoreleasepool 池子被销毁的时候被标记 autorelease 的对象调用一次release Person *p2=[[[Person alloc]init]autorelease]; ...