比赛 |
20251001国庆欢乐赛1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火柴排队 |
最终得分 |
100 |
用户昵称 |
KKZH |
运行时间 |
0.240 s |
代码语言 |
C++ |
内存使用 |
5.37 MiB |
提交时间 |
2025-10-01 11:48:38 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const long long N=1e6+10;
long long n,cn=1,ans,x[N];
struct node{
long long hi,bh;
}a[N],b[N];
struct node1{
long long cnt,l,r;
}tree[4*N];
bool cmp(node a,node b){
return a.hi<b.hi;
}
void update(long long id){
tree[id].cnt=tree[tree[id].l].cnt+tree[tree[id].r].cnt;
}
void build(long long id,long long l,long long r){
if(l==r) return;
long long mid=(l+r)/2;
tree[id].l=++cn;
tree[id].r=++cn;
build(tree[id].l,l,mid);
build(tree[id].r,mid+1,r);
}
void insit(long long id,long long l,long long r,long long x){
if(l==r){
tree[id].cnt++;
return;
}
long long mid=(l+r)/2;
if(mid>=x) insit(tree[id].l,l,mid,x);
else insit(tree[id].r,mid+1,r,x);
update(id);
}
long long find(long long id,long long l,long long r,long long x,long long y){
if(l==x&&r==y) return tree[id].cnt;
long long mid=(l+r)/2;
if(y<=mid) return find(tree[id].l,l,mid,x,y);
else{
if(x>mid) return find(tree[id].r,mid+1,r,x,y);
else return (find(tree[id].l,l,mid,x,mid)+find(tree[id].r,mid+1,r,mid+1,y));
}
}
int main(){
freopen("MatchNOIP2013.in","r",stdin);
freopen("MatchNOIP2013.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].hi),a[i].bh=i;
for(int i=1;i<=n;i++)
scanf("%d",&b[i].hi),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++)
x[b[i].bh]=a[i].bh;
build(1,1,n);
for(long long i=1;i<=n;i++){
if(x[i]<n)
ans+=find(1,1,n,x[i]+1,n);
insit(1,1,n,x[i]);
}
cout<<ans%99999997;
return 0;
}