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