zoukankan      html  css  js  c++  java
  • [算法] doj 1067 归并法求逆序对 UltraQuickSort

    #include <iostream>
    #include <cstdio>
    using namespace std;
    #define mid(x,y) ((x&y) + ((x^y)>>1))
    const int N = 500005;
    
    long long a[N];
    long long ans; // 记录逆序对个数
    void merge_sort(int l, int r) {
    	if(l >= r) return;
    	int m = mid(l,r);
    	merge_sort(l, m);
    	merge_sort(m+1, r);
    	long long *arr = new long long[r-l+1];
    	int i = l, j = m+1, k = 0;
    	while(i <= m && j <= r) {
    		if(a[i] <= a[j]) {
    			arr[k++] = a[i++];
    		}
    		else {
    			ans += (m - i + 1);
    			arr[k++] = a[j++];
    		}
    	}
    	while(i <= m) arr[k++] = a[i++];
    	while(j <= r) arr[k++] = a[j++];
    	for(int i = l; i <= r; i++) {
    		a[i] = arr[i-l];
    	}
    	delete []arr;
    }
    int main() {
    	int n;
    	while(cin >> n, n) {
    		for(int i = 0; i < n; i++) {
    			cin >> a[i];
    		}
    		ans = 0;
    		merge_sort(0, n-1);
    		cout << ans << endl;
    	}
    	return 0;
    }
    

  • 相关阅读:
    POJ 1995
    POJ 3233
    HDU 2815
    POJ 2417
    POJ 3243
    HDU 3579 线性同余方程组
    HDU 1573
    POJ 2115
    POJ 2891
    HDU 2035 不忍直视的水
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786693.html
Copyright © 2011-2022 走看看