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 }