1. 程式人生 > >1688 求逆序對

1688 求逆序對

題目 codevs ger sample -i icon 逆序 -h else

codevs——1688 求逆序對

前面剛剛說了逆序對,那就先那個題來練練手吧。。。(雖然是個板子(⊙o⊙)…)

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 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

代碼:

#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 100001
using namespace std;
int n,a[N];
long long
ans; void gsort(int l,int r) { if(l==r) return ; int mid=(l+r)/2;int tmp[N]; gsort(l,mid),gsort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(a[i]<=a[j]) tmp[k++]=a[i++]; else { ans+=mid-i+1; tmp[k
++]=a[j++]; } } while(i<=mid) tmp[k++]=a[i++]; while(j<=r) tmp[k++]=a[j++]; for(int i=l;i<=r;i++) a[i]=tmp[i]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); gsort(1,n); cout<<ans; return 0; }

1688 求逆序對