POJ 2299 Ultra-QuickSort (树状数组 + 离散化)
2016-05-28 11:51
435 查看
Description
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
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属性的值