POJ 2299 Ultra-QuickSort (树状数组 + 离散化)
2016-05-28 11:51
447 查看
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
![](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 <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 500010 inline int lowbit(int x) { return x & (-x); } int a , c , s ; int t ; int n; long long ans; void update(int i, int value) { for (; i <= n; i += lowbit(i)) c[i] += value; } int sum(int i) { int ans = 0; for (; i; i -= lowbit(i)) ans += c[i]; return ans; } int find(int x, int a[], int l, int r) { int left = l, right = r; int mid = left + (right - left) / 2; while (left <= right) { if (a[mid] == x) break; if (x < a[mid]) right = mid - 1; else left = mid + 1; mid = left + (right - left) / 2; } return mid; } void discrete() { for (int i = 1; i <= n; i++) t[i] = a[i]; sort(t + 1, t + 1 + n); for (int i = 1; i <= n; i++) a[i] = find(a[i], t, 1, n); } int main() { while (scanf("%d", &n), n) { for (int i = 1; i <= n; i++) scanf("%d", &a[i]); discrete(); memset(c, 0, sizeof(c)); ans = 0; for (int i = n; i; i--) { update(a[i], 1); ans += sum(a[i] - 1); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题
- Error building results for action sayHello in namespace /inteceptor -
- Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题
- ValueError: Cannot run multiple SparkContexts at once; existing SparkContext ...
- Android设计模式——Builder模式
- [leetcode]347. Top K Frequent Elements
- 微型orm fluentdata
- 自定义UITextView
- An exception occurred while acquiring a poolable resource. Will retry.
- EditText UI 修改
- 关于AlertDialog.Builder犯的一个错和自定义布局的限制宽高一个知识点
- Android中Looper的quit方法和quitSafely方法
- CF Infinite Sequence
- ubuntu调试arduino程序出现找不到<string>
- requests模块常用功能
- UIView
- LeetCode OJ 63. Unique Paths II
- Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)
- 根据input 标签取value属性的值
- 根据input 标签取value属性的值