- P1908 逆序对
- 在归并排序过程中如果出现了前面比后面大的情况每次将ansans加上mid-i+1mid−i+1即可得到
- 最终求出的就是逆序数。
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1008611 ll ans,n; int a[maxn],rp[maxn]; void msort(int l,int r) { if(l>=r) return ; int mid=(l+r)/2; msort(l,mid); msort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(a[i]<=a[j]) rp[k++]=a[i++]; else { rp[k++]=a[j++]; ans+=mid-i+1; } } while(i<=mid) rp[k++]=a[i++]; while(j<=r) rp[k++]=a[j++]; for(int i=l; i<=r; i++) a[i]=rp[i]; } int main() { cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; msort(1,n); cout<<ans<<endl; return 0; }
洛谷P1908-逆序对-归并排序模板
最新推荐文章于 2020-10-13 17:53:24 发布