比赛 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;
}