首页 > 代码库 > 火柴排队——重温逆序对

火柴排队——重温逆序对

  在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         else17             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

火柴排队——重温逆序对