在vijos 的NOIP 历年题库中瞄到的,搞了搞。看来的确我刚开始学归并逆序对的时候就是一塌糊涂,据说还有树状数组求法,但是我树状数组更是一塌糊涂,以后再来加吧。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 using namespace std; 5 const int N=100086,M=99999997; 6 struct node{ 7 int x,p; 8 bool operator < (const node oth) const {return x<oth.x;} 9 }l[N],r[N]; 10 int n,res,val[N],t[N]; 11 void merge(int l,int mid,int r){ 12 int pl=l,pr=mid+1; 13 for(int i=l;i<=r;i++) 14 if((pl<=mid)&&(pr>r||val[pl]<=val[pr])) 15 t[i]=val[pl++]; 16 else 17 t[i]=val[pr++],res=(res+mid-pl+1)%M; 18 for(int i=l;i<=r;i++)val[i]=t[i]; 19 } 20 void com(int l,int r){ 21 if(l<r){ 22 int mid=(l+r)>>1; 23 com(l,mid); 24 com(mid+1,r); 25 merge(l,mid,r); 26 } 27 } 28 int main(){ 29 cin>>n; 30 for(int i=1;i<=n;i++)scanf("%d",&l[i].x),l[i].p=i; 31 for(int i=1;i<=n;i++)scanf("%d",&r[i].x),r[i].p=i; 32 sort(l+1,l+1+n);sort(r+1,r+1+n); 33 for(int i=1;i<=n;i++)val[l[i].p]=r[i].p; 34 com(1,n); 35 cout<<(res%M)<<endl; 36 return 0; 37 }
Method_01
vijos 129ms CodeVS 116ms
时间: 2024-10-12 08:09:14