[POJ2182]Lost Cows(树状数组,二分)
2016-10-18 19:42
363 查看
题目链接:http://poj.org/problem?id=2182
题意:给定1~n个数和n个位置,已知ai表示第i个位置前有ai个数比当前位置的数小,求这个排列。
和刚才YY的题意蛮接近的,用树状数组维护当前数组内数字分别是第几大的,倒着查询,每次查尽可能靠右的位置,可以保证取的数字是未取到并且不会冲突。
题意:给定1~n个数和n个位置,已知ai表示第i个位置前有ai个数比当前位置的数小,求这个排列。
和刚才YY的题意蛮接近的,用树状数组维护当前数组内数字分别是第几大的,倒着查询,每次查尽可能靠右的位置,可以保证取的数字是未取到并且不会冲突。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cstdlib> 5 using namespace std; 6 7 #define lowbit(x) x & (-x) 8 const int maxn = 8080; 9 int n; 10 int a[maxn]; 11 int bit[maxn]; 12 13 void update(int i, int x) { 14 while(i <= n) { 15 bit[i] += x; 16 i += lowbit(i); 17 } 18 } 19 20 int sum(int i) { 21 int ret = 0; 22 while(i) { 23 ret += bit[i]; 24 i -= lowbit(i); 25 } 26 return ret; 27 } 28 29 int ub(int val) { 30 int lo = 1, hi = n; 31 while(lo <= hi) { 32 int mid = (lo + hi) >> 1; 33 if(sum(mid) >= val) hi = mid - 1; 34 else lo = mid + 1; 35 } 36 return lo; 37 } 38 39 void dfs(int i) { 40 if(i == 0) return; 41 int pos = ub(a[i]+1); 42 update(pos, -1); 43 dfs(i-1); 44 printf("%d\n", pos); 45 } 46 47 int main() { 48 //freopen("in", "r", stdin); 49 while(~scanf("%d", &n)) { 50 memset(a, 0, sizeof(a)); 51 memset(bit, 0, sizeof(bit)); 52 for(int i = 1; i <= n; i++) update(i, 1); 53 for(int i = 2; i <= n; i++) scanf("%d", &a[i]); 54 dfs(n); 55 } 56 return 0; 57 }
相关文章推荐
- Lost Cows(树状数组+二分)
- POJ 2182 Lost Cows(树状数组+二分)
- POJ 题目2182 Lost Cows(树状数组+二分)
- POJ2182 Lost Cows 树状数组
- POJ-2182 Lost Cows (二分 + 树状数组 或者平衡树)
- POJ 2182 Lost Cows (树状数组+二分 / 线段树 / 枚举)
- 蛤蛤蛤(树状数组 | 二分)
- BZOJ 2738 矩阵乘法 整体二分+二维树状数组
- POJ 2828 Buy Tickets(树状数组+二分)
- 树状数组+二分||线段树 HDOJ 5493 Queue
- hdu------(4302)Holedox Eating(树状数组+二分)
- HDU 5493(树状数组+二分)
- ZOJ 3635 Cinema in Akiba(树状数组 + 二分)
- HDU 2852 KiKi's K-Number(树状数组+二分)
- Codeforces Round #220 (Div. 2) D 树状数组 && 二分
- HDU 5493 Queue 树状数组+二分
- POJ 2892 Tunnel Warfare (树状数组+二分)
- bzoj2738: 矩阵乘法【整体二分+二维树状数组】
- 51Nod-1711平均数(二分+树状数组|线段树)
- BZOJ2738【整体二分】【树状数组】