比赛 线段数树状数组 评测结果 AAAAAAAAAA
题目名称 火柴排队 最终得分 100
用户昵称 youming1 运行时间 0.101 s
代码语言 C++ 内存使用 23.20 MiB
提交时间 2018-06-18 21:05:58
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int mod=99999997;
int n,ans=0;
struct match
{
    int val,pos;
}
a[1000010],b[1000010];
bool cmp(match a,match b)
{
    return a.val<b.val;
}
int c[1000010],d[1000010];
int lowbit(int x)
{
    return x&-x;
}
int getsum(int x)
{
    int sum=0;
    while(x)
    {
        sum+=d[x];
        ans%=mod;
        x-=lowbit(x);
    }
    return sum;
}
int add(int x)
{
    while(x<=n)
    {
        d[x]++;
        d[x]%=mod;
        x+=lowbit(x);
    }
}
int main()
{
	freopen("MatchNOIP2013.in","r",stdin);
	freopen("MatchNOIP2013.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].val);a[i].pos=i;
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&b[i].val);b[i].pos=i;
    }
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        c[a[i].pos]=b[i].pos;
    }
    for(int i=1;i<=n;i++)
    {
        add(c[i]);ans+=(i-getsum(c[i]));ans%=mod;
    }
    cout<<ans;
    return 0;
}