首页 > 代码库 > 火柴排队——重温逆序对
火柴排队——重温逆序对
在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 }
vijos 129ms CodeVS 116ms
火柴排队——重温逆序对
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。