比赛 线段数树状数组 评测结果 C
题目名称 火柴排队 最终得分 0
用户昵称 Xiaokang_Zhao120 运行时间 0.000 s
代码语言 C 内存使用 0.00 MiB
提交时间 2018-06-17 15:08:43
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

const int maxx=100001;
struct node
{
    int val,pos;
}a[maxx],b[maxx];
bool comp(node x,node y)
{
    return x.val<y.val;
}
int n,i,j,c[maxx],d[maxx];

void init()
{
    for(int i=0;i<maxx;i++)
        d[i]=0;
}
int lowbit(int x)
{
    return x & -x;
}
void update(int x)
{
    while(x<=n)
    {
        d[x]++;
        x+=lowbit(x);
    }
    return;
}
int getsum(int x)
{
    int res=0;
    while(x>0)
    {
        res+=d[x];
        x-=lowbit(x);
    }
    return res;
}

int main()
{
    freopen("MatchNOIP2013.in","r",stdin);freopen("MatchNOIP2013.out","w",stdout);
    int ans=0;
    init();
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].val;
        a[i].pos=i;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i].val;
        b[i].pos=i;
    }
    sort(a+1,a+1+n,comp);
    sort(b+1,b+1+n,comp);
    for(int i=1;i<=n;i++)
        c[b[i].pos]=a[i].pos;
    for(int i=1;i<=n;i++)
    {
        update(c[i]);
        ans+=(i-getsum(c[i]));
        ans%=99999997;
    }
    cout<<ans<<endl;
    return 0;
}