poj 2299 Ultra-QuickSort (树状数组)
来源:互联网 发布:阿里云ecs扩容 编辑:程序博客网 时间:2024/06/05 15:20
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
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
题意
数字很大的情况下要求逆序对。多组数据。
题解
树状数组离散化后求逆序对。(话说这题的图是不是个马桶塞啊)
代码
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n, a[500010], b[500010], pos[500010], tree[500010];int lowbit(int x) { return x & (- x);}void add(int x) { while(x <= n) { tree[x] += 1; x += lowbit(x); }}long long sum(int x) { long long ans = 0; while(x) { ans += tree[x]; x -= lowbit(x); } return ans;}int main() { while(scanf("%d", &n) && n) { memset(tree, 0, sizeof(tree)); for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), b[i] = a[i]; sort(b + 1, b + n + 1); for(int i = 1; i <= n; i ++) pos[i] = upper_bound(b + 1, b + n + 1, a[i]) - b - 1; long long ans=0; for(int i = 1; i <= n; i ++) { add(pos[i]); ans = ans + i - sum(pos[i]); } printf("%lld\n", 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
- 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 树状数组
- E
- VS2015快捷键
- [FWT] 51nod 算法马拉松26 A. A国的贸易
- 一道android笔试题目
- 自用(Spring 配置文件 和详细笔记)
- poj 2299 Ultra-QuickSort (树状数组)
- Hibernate学习笔记
- 【二分图】poj 3020 Antenna Placement
- (85)字节流读写、缓冲区
- 洛谷P1028 数的计算
- 本地如何搭建FPT服务
- 版权声明
- 1017. The Best Peak Shape (35)
- vector