比赛 |
线段数树状数组 |
评测结果 |
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;
}