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

POJ 2299 -Ultra-QuickSort-树状数组求逆序数

时间:2016-03-15 23:28:05      阅读:372      评论:0      收藏:0      [点我收藏+]

标签:

POJ 2299 Ultra-QuickSort

使用树状数组记录逆序对数。

把数组按照大小顺序插入,getsum(i)就是i前面的比他大的数。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 500005;
 8 int reflect[maxn],c[maxn],N;
 9 
10 struct Node
11 {
12     int val;
13     int pos;
14     bool operator < (const Node &r) const
15     {
16         return val < r.val;
17     }
18 }node[maxn];
19 
20 int lowbit(int x)
21 {
22     return x&(-x);
23 }
24 
25 void update(int x)
26 {
27     while(x<=N)
28     {
29         c[x] += 1;
30         x += lowbit(x);
31     }
32 }
33 
34 int getsum(int x)
35 {
36     int sum = 0;
37     while(x > 0)
38     {
39         sum += c[x];
40         x -= lowbit(x);
41     }
42     return sum;
43 }
44 
45 int main()
46 {
47     while(~scanf("%d",&N) && N)
48     {
49         for(int i=1;i<=N;i++)
50         {
51             scanf("%d",&node[i].val);
52             node[i].pos = i;
53         }
54         sort(node+1,node + N+1);
55         for(int i=1;i<=N;i++) reflect[node[i].pos] = i;
56         memset(c,0,sizeof c);
57 
58         long long ans = 0;
59         for(int i=1;i<=N;i++)
60         {
61             update(reflect[i]);
62             ans += i - getsum(reflect[i]);
63         }
64         printf("%lld\n",ans);
65     }
66 }

 

POJ 2299 -Ultra-QuickSort-树状数组求逆序数

标签:

原文地址:http://www.cnblogs.com/helica/p/5281494.html

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