POJ-2299 Ultra-QuickSort 逆序对统计
2018-02-04 21:01
363 查看
基本的树状数组求逆序对
// Ultra-QuickSort // http://poj.org/problem?id=2299 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #define forloop(i, a, b) for(int i = a; i < b; i++) #define fordown(i, a, b) for(int i = a; i > b; i--) using namespace std; const int maxn = 500010; typedef long long LL; struct Node { int val, id; }; int n; Node a[maxn]; int arr[maxn]; inline int lowbit(int x) { return x & -x; } void add(int x, int v) { for (int i = x; i < n + 4; i += lowbit(i)) { arr[i] += v; } } LL sum(int x) { LL s = 0; for (int i = x; i ; i -= lowbit(i)) { s += arr[i]; } return s; } struct NodeCmp { bool operator() (const Node& l, const Node& r) { return l.val < r.val; } }; int main() { while (cin >> n) { if (n == 0) break; memset(arr, 0, sizeof(int) * (n + 10)); forloop(i, 1, n+1) { scanf("%d", &a[i].val); a[i].id = i; } sort(a+1, a+1+n, NodeCmp()); LL ans = 0; fordown(i, n, 0) { ans += sum(a[i].id - 1); add(a[i].id, 1); } cout << ans << endl; } return 0; }
相关文章推荐
- 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(逆序数、分治)
- 【原】 POJ 2299 Ultra-QuickSort 逆序数 解题报告
- poj-2299-Ultra-QuickSort-归并排序求逆序数--或树状数组
- poj 2299 Ultra-QuickSort 求逆序数,树状数组解法,详细解析
- POJ 2299 Ultra-QuickSort——离散化+线段树求逆序数
- POJ 2299 Ultra-QuickSort ---归并排序 求逆序
- poj_2299 Ultra-QuickSort(归并排序/树状数组 求逆序对)
- Ultra-QuickSort (poj 2299 归并排序 || 树状数组 求逆序对)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对
- poj 2299 Ultra-QuickSort(fenwick树求逆序对)
- POJ 2299 Ultra-QuickSort 求逆序对数(归并排序,树状数组)