标签:
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 53630 | Accepted: 19693 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
[Submit] [Go Back] [Status] [Discuss]
——————————————————我是分割线————————————————————————
好题。归并排序求逆序对。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<cstdlib> 8 #include<iomanip> 9 #include<cassert> 10 #include<climits> 11 #define maxn 10001 12 #define F(i,j,k) for(int i=j;i<=k;i++) 13 #define FF(i,j,k) for(int i=j;i>=k;i--) 14 #define inf 0x7fffffff 15 #define NN 500004 16 #define NL 1000 17 #define mem(a) memset(a, 0, sizeof(a)) 18 using namespace std; 19 int N, A[500010], T[500010]; 20 __int64 ans; 21 int read(){ 22 int x=0,f=1;char ch=getchar(); 23 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 24 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 25 return x*f; 26 } 27 __int64 res; 28 int b[NN]; 29 void copy(int a[], int l, int r){ 30 int i; 31 for (i = l; i <= r; i++){ 32 a[i] = b[i]; 33 } 34 } 35 void merge(int a[], int l, int mid, int r){ 36 int i = l; 37 int j = mid + 1; 38 int k = l; 39 while(i <= mid && j <= r){ 40 if(a[i] < a[j]){ 41 b[k++] = a[i]; 42 i++; 43 }else{ 44 b[k++] = a[j]; 45 j++; 46 res += mid - i + 1; 47 } 48 } 49 while(i <= mid){ 50 b[k++] = a[i]; 51 i++; 52 } 53 while(j <= r){ 54 b[k++] = a[j]; 55 j++; 56 } 57 } 58 void mergeSort(int a[], int l, int r){ 59 if(l < r){ 60 int mid = (l + r) >> 1; 61 mergeSort(a, l, mid); 62 mergeSort(a, mid + 1, r); 63 merge(a, l, mid, r); 64 copy(a, l, r); 65 } 66 } 67 int main() { 68 int n, i; 69 int f[NN]; 70 while(cin>>n&&n){ 71 if(n == 0) break; 72 for (i = 1; i <= n; i++){ 73 cin>>f[i]; 74 } 75 res = 0; 76 mergeSort(f, 1, n); 77 cout<<res<<endl; 78 } 79 return 0; 80 }
标签:
原文地址:http://www.cnblogs.com/SBSOI/p/5636571.html