比赛 20251001国庆欢乐赛1 评测结果 AAAAAAAAAA
题目名称 火柴排队 最终得分 100
用户昵称 dream 运行时间 0.398 s
代码语言 C++ 内存使用 6.41 MiB
提交时间 2025-10-01 10:08:00
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=100005,mod=99'999'997;
int a[N],b[N];
struct node{
	int x,id;
	bool operator < (const node &t) const{
		if(x==t.x) return id<t.id;
		return x<t.x;
	} 
}aa[N],bb[N];
int n,ans1,ans2;
int tr[N];
int lowbit(int x){
	return x&(-x);
}
void add(int x,int v){
	while(x<=n){
		tr[x]+=v;
		x+=lowbit(x);
	}
}
int query(int x){
	int sum=0;
	while(x){
		sum+=tr[x];
		x-=lowbit(x);
	}
	return sum;
}
int c[N];
vector<int> m1,m2;
map<int,int> mp1,mp2;
int main(){
	freopen("MatchNOIP2013.in","r",stdin);
	freopen("MatchNOIP2013.out","w",stdout);
	ios::sync_with_stdio(0);
	cin>>n;
	m1.push_back(-1);
	m2.push_back(-1);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		m1.push_back(a[i]);
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
		m2.push_back(b[i]);
	}
	sort(m1.begin(),m1.end());
	sort(m2.begin(),m2.end());
	for(int i=1;i<=n;i++){
		mp1[m1[i]]=i;
		mp2[m2[i]]=i;
	}
	for(int i=1;i<=n;i++){
		a[i]=mp1[a[i]];
		b[i]=mp2[b[i]];
		aa[i]={a[i],i};
		bb[i]={b[i],i};
	}
	sort(aa+1,aa+n+1);
	sort(bb+1,bb+n+1);
	for(int i=1;i<=n;i++){
		c[bb[i].id]=aa[i].id;
	}
	for(int i=n;i>=1;i--){
		ans1+=query(c[i]-1);
		ans1%=mod;
		add(c[i],1);
	}
	memset(tr,0,sizeof(tr));
	for(int i=1;i<=n;i++){
		c[aa[i].id]=bb[i].id;
	}
	for(int i=n;i>=1;i--){
		ans2+=query(c[i]-1);
		ans2%=mod;
		add(c[i],1);
	}
	cout<<min(ans1,ans2)%mod;
    return 0;
}