POJ-2299 Ultra-QuickSort (树状数组 离散 求逆序对数)
2017-10-16 14:17
447 查看
Ultra-QuickSort
Description
![](http://poj.org/images/2299_1.jpg)
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is
sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence
element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
Sample Output
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 64185 | Accepted: 23972 |
![](http://poj.org/images/2299_1.jpg)
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is
sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence
element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define maxn 500002 struct point{ int val, id; bool operator < (const point& x){ return val < x.val; } }a[maxn]; int b[maxn], c[maxn]; inline int lowbit(int x){ return x & (-x); } void add(int x){ while(x < maxn){ c[x]++; x += lowbit(x); } } int getsum(int x){ int ans = 0; while(x){ ans += c[x]; x -= lowbit(x); } return ans; } int main(){ int n, tot; while(scanf("%d", &n) != EOF){ if(n == 0){ return 0; } a[0].val = -1; for(int i = 1; i <= n; ++i){ scanf("%d", &a[i].val); a[i].id = i; } sort(a + 1, a + 1 + n); tot = 0; for(int i = 1; i <= n; ++i){ if(a[i].val == a[i - 1].val){ b[a[i].id] = tot; } else{ b[a[i].id] = ++tot; } } memset(c, 0, sizeof(c)); long long ans = 0; for(int i = 1; i <= n; ++i){ ans += i - 1 - getsum(b[i]); add(b[i]); } printf("%lld\n", ans); } } /* 题意:求逆序对个数。 思路:树状数组。 */
相关文章推荐
- POJ 2299 Ultra-QuickSort 【归并排序 || 树状数组求逆序对数】
- (POJ 2299)Ultra-QuickSort 树状数组求逆序对数 + 离散化
- poj2299 B - Ultra-QuickSort(线段树与树状数组求逆序对数)
- poj 2299 Ultra-QuickSort 【线段树 or 线段树+lazy or 树状数组 or 归并排序】 求逆序对
- POJ 2299 Ultra-QuickSort 【归并排序求逆序数 OR 树状数组求逆序数】
- 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(树状数组求逆序数+离散化)
- Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对
- Ultra-QuickSort (poj 2299 归并排序 || 树状数组 求逆序对)
- POJ 2299 Ultra-QuickSort【树状数组求逆序】