POJ 2299 Ultra-QuickSort(树状数组入门) 求逆序数
2013-07-25 08:05
288 查看
/** * 树状数组 入门题: (求逆序数) * 这道题wa了好几次,还是意识不够!看discuss才知道,答案是要用long long型来存的! * 还有个就是离散化,相当于把所有数据的值先排个序,换成另外一个1~n的值。 * 怎么说呢? 比如 9 5 1 3 8 离散化后就是 5 3 1 2 4 这样尽管单个数据再大, * 也能根据大小离散成 1~n的顺序。 目的是为了能使 bit[i] 表示对于数i之前的数已出现的个数。 * 若不进行离散化的话, i 会很大,导致数组也开不下。 */ #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> #define INF 0x7fffffff #define MAXS 500005 #define LL __int64 using namespace std; struct Node { LL d; int pos; bool operator < (const Node &a) const { return d < a.d; } }num[MAXS]; int n, c[MAXS], bit[MAXS]; void input() { for(int i = 1; i <= n; i ++) { scanf("%I64d", &num[i].d); num[i].pos = i; } } int lowbit(int x) { return x & (-x); } void change() { for(int i = 1; i <= n; i ++) c[num[i].pos] = i; } int get_sum(int x) { int ret = 0; for(int i = x; i > 0; i -= lowbit(i)) { ret += bit[i]; } return ret; } void update(int d) { for(int i = d; i <= n; i += lowbit(i)) { bit[i] ++; } } LL cal_ans() { LL ret = 0; for(int i = 1; i <= n; i ++) { ret += c[i] - get_sum(c[i] - 1) - 1; update(c[i]); } return ret; } int main() { while(scanf("%d", &n), n) { memset(bit, 0, sizeof(bit)); input(); sort(num + 1, num + n + 1); change(); printf("%I64d\n", cal_ans()); } return 0; }
相关文章推荐
- POJ 2299 Ultra-QuickSort【求逆序数:归并排序|树状数组】
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
- POJ 2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort (树状数组求逆序数)
- poj--2299 Ultra-QuickSort(树状数组求逆序数)
- POJ 2299 -Ultra-QuickSort-树状数组求逆序数
- POJ 2299 Ultra-QuickSort 求逆序数 树状数组
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- poj 2299 Ultra-QuickSort 树状数组求逆序数 离散化
- POJ[2299]Ultra-QuickSort 逆序对:线段树||树状数组||分治
- POJ 2299 Ultra-QuickSort (树状数组)
- POJ 2299 Ultra-QuickSort(归并排序,树状数组,离散化)
- POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
- poj2299 B - Ultra-QuickSort(线段树与树状数组求逆序对数)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)