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

Posted Helica

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2299 -Ultra-QuickSort-树状数组求逆序数相关的知识,希望对你有一定的参考价值。

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-树状数组求逆序数的主要内容,如果未能解决你的问题,请参考以下文章

poj2299(归并排序求逆序对)

归并排序求逆序对poj2299

poj--2299(树状数组+离散化)

用归并排序或树状数组求逆序对数量 poj2299

poj2299--归并排序求解逆序对

poj2299 树状数组入门题