求逆序数 + 离散化

POJ 2299 Ultra-QuickSort

裸逆序数对~

离散化后,用树状数组统计 “(在a[i]之前加入的) 比a[i]大的数 ” 的个数

 

贴个模板:

 1 #include<map>
 2 #include<set>
 3 #include<list>
 4 #include<cmath>
 5 #include<ctime>
 6 #include<queue>
 7 #include<stack>
 8 #include<cctype>
 9 #include<cstdio>
10 #include<string>
11 #include<vector>
12 #include<cstdlib>
13 #include<cstring>
14 #include<complex>
15 #include<utility>    //pair
16 #include<iostream>
17 #include<algorithm>
18 #define MAXN 500005
19 #define INF 0x3f3f3f3f
20 #define LL long long
21 #define DBL double
22 #define eps 1e-6
23 #define pi acos(-1.0)
24 #define Test() cout<<"Test"<<endl;
25 #define Debug(a) cout<<#a<<" = "<<a<<endl;
26 #define Debug2(a,b) cout<<#a<<" = "<<a<<" , "<<#b<<" = "<<b<<endl;
27 using namespace std;
28 
29 int n;
30 int a[MAXN], b[MAXN], c[MAXN];
31 
32 int f(int x){
33     int l=1, r=n, m;
34     while(l<=r){
35         m = (l+r)/2;
36         if(x==b[m])    return m;
37         if(x<b[m])    r=m-1;
38         else    l=m+1;
39     }
40     return 0;
41 }
42 int lowbit(int x){
43     return x&(-x);
44 }
45 void add(int p, int x){
46     for(int i=p; i<=n; i+=lowbit(i))
47         c[i]+=x;
48 }
49 int sum(int p){
50     int s=0;
51     for(int i=p; i>0; i-=lowbit(i))
52         s+=c[i];
53     return s;
54 }
55 
56 int main()
57 {    
58     while(cin >> n, n){
59         for(int i=1; i<=n; i++){
60             scanf("%d", &a[i]);
61             b[i] = a[i];
62         }
63         sort(b+1, b+1+n);
64         memset(c, 0, sizeof(c));
65         LL ans=0;
66         for(int i=1; i<=n; i++){
67             int rank = f(a[i]);
68             add(rank, 1);
69             ans += (LL)(sum(n)-sum(rank));
70         }
71         cout << ans << endl;
72     }
73     
74     return 0;
75 }
View Code

 

posted on 2014-04-17 22:08  KimKyeYu  阅读(213)  评论(0编辑  收藏  举报

导航