记录编号 |
82206 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2013]火柴排队 |
最终得分 |
100 |
用户昵称 |
digital-T |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.148 s |
提交时间 |
2013-11-22 13:32:55 |
内存使用 |
3.34 MiB |
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF=99999997;
int N,tot;
pair<long long,int> a[100001],b[100001];
int c[100001],d[100001];
bool op(pair<long long,int> x,pair<long long,int> y){return x.first<y.first;}
void msort(int l,int r)
{
if(l>=r)return;
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
int p1=l,p2=mid+1;
for(int i=l;i<=r;i++)
{
if(p2>r||(p1<=mid&&c[p1]<=c[p2]))
{
d[i]=c[p1];
p1++;
}
else//找到逆序
{
d[i]=c[p2];
p2++;
tot+=(mid-p1+1);
tot%=INF;
}
}
for(int i=l;i<=r;i++)c[i]=d[i];
}
int main()
{
freopen("MatchNOIP2013.in","r",stdin);
freopen("MatchNOIP2013.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i].first);
a[i].second=i;
}
for(int j=1;j<=N;j++)
{
scanf("%d",&b[j].first);
b[j].second=j;
}
sort(a+1,a+N+1,op);
sort(b+1,b+N+1,op);
for(int i=1;i<=N;i++)
c[a[i].second]=b[i].second;
tot=0;
msort(1,N);
printf("%d\n",tot);
return 0;
}