洛谷P1966 [NOIP2013 提高組] 火柴排隊
阿新 • • 發佈:2022-04-03
主要思路:離散化+歸併求逆序對
點選檢視程式碼
#include<bits/stdc++.h> using namespace std; const int N=1e5+10,M=1e8-3; int p[N],tmp[N],cnt=0; struct FF{ int h,fi; }fs1[N],fs2[N]; bool cmp(FF x,FF y){ return x.h<y.h; } void merge_sort(int l,int r){ if(l>=r) return ; int mid=l+r>>1; merge_sort(l,mid); merge_sort(mid+1,r); int k=0,i=l,j=mid+1; while(i<=mid&&j<=r){ if(p[i]<=p[j]) tmp[k++]=p[i++]; else{ cnt+=mid-i+1; cnt%=M; tmp[k++]=p[j++]; } } while(i<=mid) tmp[k++]=p[i++]; while(j<=r) tmp[k++]=p[j++]; for(int i=l,j=0;i<=r;i++,j++){ p[i]=tmp[j]; } } int main(){ int n,h; cin>>n; for(int i=0;i<n;i++){ scanf("%d",&h); fs1[i].h=h; fs1[i].fi=i; } for(int i=0;i<n;i++){ scanf("%d",&h); fs2[i].h=h; fs2[i].fi=i; } sort(fs1,fs1+n,cmp); sort(fs2,fs2+n,cmp); for(int i=0;i<n;i++){ p[fs2[i].fi]=fs1[i].fi; } merge_sort(0,n-1); cout<<cnt; return 0; }