poj2299 Ultra-QuickSort

逆序对模板题,过水不解释

 1 // poj 2299
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int N = 500010;
 7 int a[N],x[N];
 8 struct TreeArray {
 9     int t[N];
10     int lowbit(int a) {
11         return a & (-a);
12     }
13     void add(int x, int a) {
14         if(a == 0 || x == 0) {
15             return;
16         }
17         for(int i = x; i < N; i += lowbit(i)) {
18             t[i] += a;
19         }
20         return;
21     }
22     int getsum(int x) {
23         if(x == 0) {
24             return 0;
25         }
26         int ans = 0;
27         for(int i = x; i > 0; i -= lowbit(i)) {
28             ans += t[i];
29         }
30         return ans;
31     }
32     int ask(int l, int r) {
33         return getsum(r) - getsum(l - 1);
34     }
35     void clear() {
36         memset(t,0,sizeof(t));
37         return;
38     }
39 }ta;
40 
41 int main() {
42     int n;
43     scanf("%d", &n);
44     x[0] = -1;
45     while(n) {
46         ta.clear();
47         for(int i = 1; i <= n; i++) {
48             scanf("%d", &a[i]);
49             x[i] = a[i];
50         }
51         sort(x + 1, x + n + 1);
52         int k = 0;
53         for(int i = 1; i <= n; i++) {
54             if(x[i] != x[i-1]) {
55                 x[++k] = x[i];
56             }
57         }
58         /// /////////43
59         long long ans = 0;
60         for(int i = n; i > 0; i--) {
61             int p = lower_bound(x + 1, x + k + 1, a[i]) - x;
62             ans += ta.getsum(p - 1);
63             ta.add(p, 1);
64         }
65         printf("%I64d\n", ans);
66         scanf("%d", &n);
67     }
68     return 0;
69 }
AC代码

 

posted @ 2018-05-06 18:07  garage  阅读(99)  评论(0编辑  收藏  举报