您的位置:首页
BestCoder Round #65 HDOJ5592 ZYB's Premutation(树状数组+二分)
2017-06-08 10:52
246 查看
ZYB's Premutation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 638 Accepted Submission(s): 302
Problem Description
ZYB has
a premutation P,but
he only remeber the reverse log of each prefix of the premutation,now he ask you to
restore the premutation.
Pair (i,j)(i<j) is
considered as a reverse log if Ai>Aj is
matched.
Input
In the first line there is the number of testcases T.
For each teatcase:
In the first line there is one number N.
In the next line there are N numbers Ai,describe
the number of the reverse logs of each prefix,
The input is correct.
1≤T≤5,1≤N≤50000
Output
For each testcase,print the ans.
Sample Input
1 3 0 1 2
Sample Output
3 1 2
题目链接:点击打开链接
能够想到a[i] - a[i - 1]为i前比a[i]大的数的个数, 从后向前遍历, 通过二分与树状数组确定i应当填入的位置.
AC代码:
#include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "queue" #include "stack" #include "cmath" #include "utility" #include "map" #include "set" #include "vector" #include "list" #include "string" using namespace std; typedef long long ll; const int MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; const int MAXN = 5e4 + 5; int n, a[MAXN], c[MAXN], ans[MAXN]; int lowbit(int x) { return x & (-x); } void update(int x, int y) { while(x <= n) { c[x] += y; x += lowbit(x); } } int get_sum(int x) { int sum = 0; while(x > 0) { sum += c[x]; x -= lowbit(x); } return sum; } int binary_search(int x) { int l = 1, r = n, m; while(l <= r) { m = (l + r) >> 1; if(get_sum(m) >= x) r = m - 1; else l = m + 1; } return l; } int main(int argc, char const *argv[]) { int t; scanf("%d", &t); while(t--) { memset(c, 0, sizeof(c)); memset(ans, 0, sizeof(ans)); scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); for(int i = n; i >= 1; --i) a[i] -= a[i - 1]; for(int i = 1; i <= n; ++i) update(i, 1); for(int i = n; i >= 1; --i) { int pos = i - a[i] - 1; ans[i] = binary_search(pos + 1); update(ans[i], -1); } for(int i = 1; i < n; ++i) printf("%d ", ans[i]); printf("%d\n", ans ); } return 0; }
相关文章推荐
- HDOJ 5592 ZYB's Premutation(逆序对变题:树状数组+二分||线段树)
- BestCoder Round #65 HDOJ5592 ZYB's Premutation(树状数组+二分)
- HDU 5592 ZYB's Premutation(树状数组 + 二分)
- HDU 5592 ZYB's Premutation(二分+树状数组)
- HDU5592 ZYB's Premutation(树状数组)
- HDU 5592 ZYB's Premutation 线段树
- 杭电 5592 ZYB's Premutation(线段树求第k大数)
- ACM学习历程—HDU5592 ZYB's Premutation(逆序数 && 树状数组 && 二分)(BestCoder Round #65 1003)
- hdu 5592 ZYB's Premutation(线段树求逆序数)
- HDU 5592 ZYB's Premutation
- HDU 5592 ZYB's Permutation(树状数组)
- hdu 5592 ZYB's Premutation (线段树)
- HDU 5592:ZYB's Premutation 树状数组+二分
- HDU 5592(ZYB's Premutation-线段树)
- HDU 5592 ZYB's Premutation(树状数组+二分)
- hdu 5592 ZYB's Premutation 线段树
- KiKi's K-Number(树状数组+二分)
- hdoj 1166 敌兵布阵 【线段树&&二分树】【树状数组】
- HDU 2852 KiKi's K-Number(树状数组+二分)
- BestCoder #65 1003 ZYB's Premutation