火柴排队——noip2013——提高组
Posted Yzyet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了火柴排队——noip2013——提高组相关的知识,希望对你有一定的参考价值。
作为D1T2的这题,做法的确挺巧妙的。
首先,我们发现:
对于a1<a2, b1>b2
则 (a1-b1)^2+(a2-b2)^2>(a1-b2)^2+(a2-b1)^2
自己拆开推一下就知道了。。
然后我们对数据进行离散化。把b数组的元素映射到a里。
由于我们需要求,使映射完的结果不下降,需要调换多少次。
求这个,也就可以转换成求逆序对。
然后,就大功告成了。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();} while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();} return num*t; } const int maxn=100010,mod=99999997; struct hh{int h,num;}x[maxn],y[maxn]; bool cmp(hh a,hh b){return a.h<b.h;} int a[maxn],b[maxn],n,ans=0; void gbsort(int l,int r){ if(l==r)return; int mid=(l+r)>>1; gbsort(l,mid);gbsort(mid+1,r); int cnt=l,s=l,t=mid+1; while(s<=mid&&t<=r){ if(a[s]<=a[t])b[cnt++]=a[s++]; else{b[cnt++]=a[t++];ans=(ans+mid-s+1)%mod;} } while(s<=mid)b[cnt++]=a[s++]; while(t<=r)b[cnt++]=a[t++]; for(int i=l;i<=r;i++)a[i]=b[i]; } int main() { n=read(); for(int i=1;i<=n;i++)x[i].h=read(),x[i].num=i; for(int i=1;i<=n;i++)y[i].h=read(),y[i].num=i; sort(x+1,x+1+n,cmp);sort(y+1,y+1+n,cmp); for(int i=1;i<=n;i++)a[x[i].num]=y[i].num; gbsort(1,n);printf("%d\\n",ans); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
以上是关于火柴排队——noip2013——提高组的主要内容,如果未能解决你的问题,请参考以下文章