码迷,mamicode.com
首页 > 编程语言 > 详细

【POJ2266】【树状数组+离散化】Ultra-QuickSort

时间:2015-03-07 09:03:43      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

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

【分析】

开始离散化用MAP T了半天,不活了..

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <vector>
 6 #include <utility>
 7 #include <iomanip>
 8 #include <string>
 9 #include <cmath>
10 #include <map>
11 
12 const int MAXN = 500000 + 10;
13 const int MAXM = 500000 + 10;
14 //const int MAXM = 2000 + 10;
15 const int MAXL = 10;
16 using namespace std;
17 struct DATA{
18        int val;
19        int order;
20        bool operator < (DATA b)const{
21             return val < b.val;
22        }
23 }rem[MAXN];
24 typedef long long ll;
25 int n;
26 int data[MAXN];
27 int C[MAXN];
28 
29 void init(){
30      for (int i = 1; i <= n; i++) {
31          scanf("%d", &data[i]);
32          C[i] = 0;
33          rem[i].val = data[i];
34          rem[i].order = i;
35      }
36      sort(rem + 1, rem + 1 + n);
37      for (int i = 1; i <= n; i++) data[rem[i].order] = i;
38      //for (int i = 1; i <= n; i++) printf("%d\n", data[i]);printf("\n");
39 }
40 int lowbit(int x){return x&-x;}
41 int sum(int x){
42    int cnt = 0;
43    while (x > 0){
44          cnt += C[x];
45          x -= lowbit(x);
46    }
47    return cnt;
48 }
49 void add(int x){
50    while (x <= n){
51          C[x]++;
52          x += lowbit(x);
53    }
54    return;
55 }
56 
57 void work(){
58      ll Ans = 0;
59      //前面共 i - 1个数字 
60      for (int i = 1; i <= n; i++){
61          Ans += (i - 1 - sum(data[i]));//严格大于
62          add(data[i]); 
63      }
64      printf("%lld\n", Ans);
65 }
66 
67 int main(){
68      #ifdef LOCAL
69      freopen("data.txt", "r", stdin);
70      freopen("out.txt", "w", stdout); 
71      #endif 
72      while (scanf("%d", &n) && n){
73            init();
74            work();
75      }
76      return 0;
77 }
78  
View Code

 

【POJ2266】【树状数组+离散化】Ultra-QuickSort

标签:

原文地址:http://www.cnblogs.com/hoskey/p/4319695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!