UVA 11525 - Permutation(树状数组)
2014-07-30 17:03
246 查看
UVA 11525 - Permutation
题目链接题意:给定一个k个数字,求第n个全排列,由于n很大,输入的方式为∑k1Si∗(K−i)!
思路:全排列,很容易看出,前面的si对应的就是数组中第k小的数字,那么问题变成每次找第k小的数字,然后去掉这个数字,这个用树状数组很容易实现
代码:
#include <cstdio>
#include <cstring>
#define lowbit(x) (x&(-x))
const int N = 50005;
int t, k, bit
;
void add(int x, int v) {
while (x <= k) {
bit[x] += v;
x += lowbit(x);
}
}
int get(int x) {
int ans = 0, num = 0;
for (int i = 16; i >= 0; i--) {
ans += (1<<i);
if (ans >= k || bit[ans] + num >= x)
ans -= (1<<i);
else num += bit[ans];
}
return ans + 1;
}
int main() {
scanf("%d", &t);
while (t--) {
memset(bit, 0, sizeof(bit));
scanf("%d", &k);
for (int i = 1; i <= k; i++)
add(i, 1);
int num;
for (int i = 1; i <= k; i++) {
scanf("%d", &num);
num++;
int v = get(num);
printf("%d%c", v, i == k ? '\n' : ' ');
add(v, -1);
}
}
return 0;
}
相关文章推荐
- UVA 11525 Permutation(树状数组)
- UVA 11525 Permutation(树状数组)
- UVa 11525 - Permutation (线段树 树状数组 康托展开式)
- UVA 11525 Permutation(树状数组)
- uva 11525 树状数组 求第k大数
- uva 11525排列(树状数组 + 二分)
- UVA_11525 树状数组的活用 二分
- uva 11525 - Permutation(线段树)
- 北京师范大学第十四届ACM决赛- B Squared Permutation 树状数组
- UVA 1513 - Movie collection(树状数组)
- UVa 11610 Reverse Prime(树状数组+二分)
- UVALive 6508(树状数组求逆序数)
- POJ 3928 & hdu 2492 & Uva1428 PingPong 【树状数组】
- UVA 1406 - A Sequence of Numbers(树状数组)
- UVA-1428 - Ping pong(树状数组)
- UVA 10909 - Lucky Number(树状数组)
- 北京师范大学第十四届ACM决赛- B Squared Permutation 树状数组
- 树状数组uva1513(好)
- UVA 10869 - Brownie Points II(树状数组+离散化)
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)