題目描述
貓貓TOM和小老鼠JERRY最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的游戲,現在他們喜歡玩統計。最近,TOM老貓查閱到一個人類稱之為“逆序對”的東西,這東西是這樣定義的:對於給定的一段正整數序列,逆序對就是序列中ai>aj且i<j的有序對。知道這概念后,他們就比賽誰先算出給定的一段正整數序列中逆序對的數目。
輸入輸出格式
輸入格式:
第一行,一個數n,表示序列中有n個數。
第二行n個數,表示給定的序列。
輸出格式:
給定序列中逆序對的數目。
輸入輸出樣例
輸入樣例#1:
6 5 4 2 6 3 1
輸出樣例#1:
11
說明
對於50%的數據,n≤2500
對於100%的數據,n≤40000。
思路:歸並排序思想
代碼實現:
1 #include<cstdio> 2 int n; 3 int s[100001],v[100001]; 4 int gb(int x,int y){ 5 if(x==y) return 0; 6 int mid=(x+y)>>1; 7 int ans=gb(x,mid)+gb(mid+1,y); 8 int p=x,j=x,k=mid+1; 9 while(j<=mid&&k<=y){ 10 if(s[j]>s[k]) 11 {ans+=mid-j+1;v[p++]=s[k++];} 12 else v[p++]=s[j++]; 13 } 14 while(j<=mid) v[p++]=s[j++]; 15 while(k<=y) v[p++]=s[k++]; 16 for(int i=x;i<=y;i++) s[i]=v[i]; 17 return ans; 18 } 19 int main(){ 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++) scanf("%d",&s[i]); 22 printf("%d\n",gb(1,n)); 23 return 0; 24 }
題目描述
Description
給定一個序列a1,a2,…,an,如果存在i<j並且ai>aj,那么我們稱之為逆序對,求逆序對的數目
數據范圍:N<=105。Ai<=105。時間限制為1s。
輸入描述
Input Description
第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。
輸出描述
Output Description
所有逆序對總數.
樣例輸入
Sample Input
4
3
2
3
2
樣例輸出
Sample Output
3
略有改動即可。
代碼實現:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 long long ans,n; 5 int s[100001],v[100001]; 6 void gbpx(int x,int y){ 7 if(x==y) return; 8 int mid=(x+y)/2; 9 gbpx(x,mid);gbpx(mid+1,y); 10 int p=x,j=x,k=mid+1; 11 while(j<=mid&&k<=y){ 12 if(s[j]>s[k]) 13 {ans+=mid-j+1;v[p++]=s[k++];} 14 else v[p++]=s[j++]; 15 } 16 while(j<=mid) v[p++]=s[j++]; 17 while(k<=y) v[p++]=s[k++]; 18 for(int i=x;i<=y;i++) s[i]=v[i]; 19 } 20 int main(){ 21 cin>>n; 22 for(int i=1;i<=n;i++) cin>>s[i]; 23 gbpx(1,n); 24 cout<<ans<<endl; 25 return 0; 26 }
題目來源:洛谷,CODE[VS]