poj 2182 树状数组
2015-08-27 20:00
309 查看
倒着考虑,如果最后一只牛的前面有x只比它小,那么它就是第x+1只牛,从序列中去掉它。对倒数第二只牛来说也同理。可以用树状数组来维护前缀和,一开始每个位置都是1,求出结果的牛从树状数组中删掉(update成0),即可获得答案。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 8001; int c ; int r ; int ans ; int n; int lb( int i ) { return i & -i; } void update( int i, int v ) { while ( i <= n ) { c[i] += v; i += lb(i); } } int kth( int k ) { int ans = 0, cnt = 0; for ( int i = 12; i >= 0; i-- ) { ans += ( 1 << i ); if ( ans >= n || cnt + c[ans] >= k ) { ans -= ( 1 << i ); } else { cnt += c[ans]; } } return ans + 1; } int main () { while ( scanf("%d", &n) != EOF ) { memset( c, 0, sizeof(c) ); for ( int i = 1; i <= n; i++ ) { update( i, 1 ); } r[1] = 1; for ( int i = 2; i <= n; i++ ) { scanf("%d", &r[i]); r[i]++; } for ( int i = n; i >= 1; i-- ) { ans[i] = kth( r[i] ); update( ans[i], -1 ); } for ( int i = 1; i <= n; i++ ) { printf("%d\n", ans[i]); } } return 0; }
相关文章推荐
- Apache安装
- Spark Core and Cluster Managers(翻译自Learning.Spark.Lightning-Fast.Big.Data.Analysis)
- 第2章 基本数据类型、数组、循环及条件表达式
- IoT service,mqtt,publish topic different from subscribe topic
- axis2之实现方式xmlbeans
- C/C++编程题之大数相乘
- Hibernate3使用(三)Spring整合Hibernate自动扫描
- Android开发中Activity跳转动画以及finish动画
- linux下执行aapt时,提示/usr/lib/libz.so.1 no version information available
- 什么是自动装箱?和自动拆箱?
- HDU 1568 Fibonacci(科学计数法+对数)
- hdu 1690 Bus System
- 关于android客户端的导航栏(toolbar)
- Android菜单
- python---序列可使用的内建函数(BIFs)
- 手势识别器
- django ajax使用
- ios-QQ界面(利用新浪微博方法实现,消除新浪微博重复计算的缺点)
- 安卓开发笔记——打造属于自己的博客园APP(四)
- Linux下配置DHCP服务器