day1 火柴排队

noip2013的第二题,就思路上来讲,两数组输入数据后予以排序(利用自带的c++中sort就好O(∩_∩)O~),然后找找逆序对的个数就好了,原理运用到了数学中的排序不等式:设有两组数a1,a2,……an,b1,b2,……bn,满足a1≤a2≤……≤an,b1≤b2≤……≤bn,则有a1bn+a2bn-1+……+anb1≤a1bt+a2bt+……+anbt≤a1b1+a2b2+anbn式中,t1,t2,……,tn是1,2,……,n的任意一个排列,当且仅当a1=a2=……=an或b1=b2=……=bn时成立。一般为了便于记忆,常记为:反序和≤乱序和≤同序和(取自百度百科)。下面贴出代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define lowbit(x) (((~(x))+1)&x)
struct data{
int order,bh;
};
data a[100005];
data b[100005];
int maxx=99999997;
bool cmp(data x,data y)
{
return x.order<y.order;
}
int n,r[100005], ans=0;
int t[100008];
void add(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
t[i]++;
}
int sum(int x)
{
int rec=0;
for (;x;x-=lowbit(x))
rec+=t[x];
return rec;
}
int main()
{
freopen("match.in","r",stdin);
freopen("match.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i].order),a[i].bh=i;
for (int i=1;i<=n;i++) scanf("%d",&b[i].order),b[i].bh=i;
sort(a+1,a+n+1,cmp);sort(b+1,b+n+1,cmp);
for(int i=1;i<=n;i++)
r[a[i].bh]=b[i].bh;
for(int i=n;i>=1;i--)
{
ans+=sum(r[i]);
add(r[i]);
ans%=maxx;
}
cout<<ans;
return 0;
}

清清正正射命丸文是也~

posted @ 2016-07-11 21:20  ShameimaruAya  阅读(134)  评论(0编辑  收藏  举报