1. 程式人生 > >逆序數 51nod 1019 歸並 分治

逆序數 51nod 1019 歸並 分治

opened closed -i hid 逆序 i++ text %d sta

在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麽它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出一個整數序列,求該序列的逆序數。 Input
第1行:N,N為序列的長度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
Output
輸出逆序數
Input示例
4
2
4
3
1
Output示例
4

看程序吧 不會講
技術分享
 1 #include <iostream>
 2 using namespace
std; 3 #include<string.h> 4 #include<set> 5 #include<stdio.h> 6 #include<math.h> 7 #include<queue> 8 #include<map> 9 #include<algorithm> 10 #include<cstdio> 11 #include<cmath> 12 #include<cstring> 13 #include <cstdio> 14 #include <cstdlib> 15
#include<stack> 16 #include<vector> 17 int a[51000]; 18 int b[51000]; 19 long long sum=0; 20 void dfs1(int kaishi,int zhongjian,int jieshu) 21 { 22 int i=kaishi,j=zhongjian+1; 23 int k=kaishi; 24 while(i<=zhongjian&&j<=jieshu) 25 { 26 if(a[i]<a[j]) 27 b[k++]=a[i++];
28 else 29 { 30 31 b[k++]=a[j++]; 32 sum+=zhongjian-i+1; 33 //cout<<j<<"_"<<k<<endl; 34 continue; 35 } 36 } 37 while(i<=zhongjian) 38 { 39 b[k++]=a[i++]; 40 } 41 while(j<=jieshu) 42 { 43 b[k++]=a[j++]; 44 } 45 for(i=kaishi;i<=jieshu;i++) 46 a[i]=b[i]; 47 } 48 void dfs(int kaishi,int jieshu) 49 { 50 if(kaishi<jieshu) 51 { 52 int zhongjian=(kaishi+jieshu)/2; 53 dfs(kaishi,zhongjian); 54 dfs(zhongjian+1,jieshu); 55 dfs1(kaishi,zhongjian,jieshu); 56 } 57 } 58 int main() 59 { 60 int n; 61 scanf("%d",&n); 62 for(int i=0;i<n;i++) 63 { 64 scanf("%d",&a[i]); 65 b[i]=a[i]; 66 } 67 dfs(0,n-1); 68 cout<<sum<<endl; 69 return 0; 70 }
View Code

逆序數 51nod 1019 歸並 分治