BZOJ5170: Fable 树状数组
Description
Input
Output
Sample Input
3
2
1
Sample Output
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 树状数组的更多相关文章
- 【bzoj5170】Fable(树状数组)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5170 我们会发现,经过一轮冒泡后,若a[i]的前面有比它大的数,就一定会有一个被丢到后 ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
随机推荐
- 《javascript算法--对象的比较》
方法一:JSON.stringify() 此方法简单,适用于当两个对象的属性顺序相同的时候. var user1 = {name : "nerd", org: "dev& ...
- ie兼容图片缩小后模糊失真(锯齿)问题
解决IE下图片缩小失真(有锯齿)的问题 首先,这不是一个新鲜玩意儿,很多大牛08年就发现了. 其次,这是个所有IE下普遍都会遇到的问题,而非只针对于IE67.(百度了一下,大半左右的文章是针对于I ...
- python count()
count() 描述 Python count() 方法用于统计字符串里某个字符出现的次数.可选参数为在字符串搜索的开始与结束位置. 语法 count()方法语法: str.count(sub, st ...
- qsv转mp4
1:下载格式工厂:http://rj.baidu.com/soft/detail/13052.html?ald 2:安装 :选择安装位置,把不需要安装的软件前面的对号去掉. 3:下一步,把不需要的软件 ...
- Scala里面如何使用枚举
枚举通常用来定义已知数量的常量,比如月份,星期,季节等等,用过java的人都知道定义枚举的关键字是enum,在scala里面和java有所不同,来看一个完整的例子定义: object EnumTest ...
- 20170809直接访问功能测试Postman
20170809直接访问功能测试Postman 1 打开admin账户登录界面,打开F12,登录 admin账户,点击系统管理,用户设置,获得网址http://10.200.44.69:8080/cl ...
- 第一章SpringBoot入门
一.简介 SpringBoot来简化Spring应用的开发,约定大于配置,去繁从简,just run就能创建一个独立的产品级别的应用. 背景: j2EE笨重的开发方法,繁多的配置,低下的开发效率,复杂 ...
- AI-Tank
编程,就是编写人生,你的思维越好,就的生活就会充满乐趣,不多说了,下面来讲一个游戏. 讲游戏的开始,要说一点,游戏可以玩,不能沉溺.不然人的一生就会沦陷进去. 下面讲一个使用的代码游戏. 在玩游戏的时 ...
- php hash算法
任意长度的输入, 固定长度的输出 ,该输出就是hash值,这种转换就是一种压缩映射,也就是hash值的空间远远小于输入的空间, 不同的输入可能散列成相同的输出,而不能从hash值来唯一的确定输入值. ...
- VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...