1 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int q[N],temp[N]; typedef long long LL; LL merge_sort(int l,int r) { if(l>=r) return 0; int mid=l+r>>1; LL res=0; res+=merge_sort(l,mid); //左边的逆序对数目 res+=merge_sort(mid+1,r); //右边的逆序对数目 int i=l,j=mid+1; int idx=0; while(i<=mid&&j<=r) { if(q[i]<=q[j]) temp[idx++]=q[i++]; else { res+=mid-i+1;//加上q[j]和左边序列构成的逆序对数目 temp[idx++]=q[j++]; } } while(i<=mid) temp[idx++]=q[i++]; //左边还没有放完 while(j<=r) temp[idx++]=q[j++]; //右边还没有放完 for(int i=l,idx=0;i<=r;i++,idx++) //按照顺序放到原位置 { q[i]=temp[idx]; } return res; //返回l到r这段的逆序对数目 } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>q[i]; } cout<<merge_sort(1,n); return 0; }
- 1
Information
- ID
- 328
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 17
- Accepted
- 6
- Uploaded By