记录编号 602348 评测结果 AAAAAAAAAA
题目名称 4166.遵循指令之意 最终得分 100
用户昵称 GravatarChenBp 是否通过 通过
代码语言 C++ 运行时间 2.368 s
提交时间 2025-07-03 16:52:44 内存使用 9.83 MiB
显示代码纯文本
#include <iostream>
#include <algorithm>
using namespace std;
int n,a[1000000],b[1000000],c[1000006];
int tree1[1000006],tree2[1000006];
int lowbit(int x){
	return x&(-x);
}
void add(int tree[],int x,int y){
	for(int i=x;i<=n;i+=lowbit(i)){
		tree[i]+=y;
	}
}
int ask(int tree[],int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		ans+=tree[i];
	}
	return ans;
}
int main() {
	freopen("sort.in","r",stdin);
	freopen("sort.out","w",stdout);
	cin>>n;
	int cnt1=0,cnt2=0;
	for(int i=1;i<=n;i++){
		if(i&1) cin>>a[++cnt1];
		else cin>>b[++cnt2];
	}
	
	// 求逆序对 
	int n1=0,n2=0;
	for(int i=1;i<=cnt1;i++){
		n1+=ask(tree1,a[i]-1);
		add(tree1,a[i],1);
	}
	for(int i=1;i<=cnt2;i++){
		n2+=ask(tree2,b[i]-1);
		add(tree2,b[i],1);
	}
	
	sort(a+1,a+1+cnt1);
	sort(b+1,b+1+cnt2);
	cnt1=cnt2=0;
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(i&1) c[++cnt]=a[++cnt1];
		else c[++cnt]=b[++cnt2];
	}
	
	if((n1&1)!=(n2&1)){
		swap(c[cnt],c[cnt-2]);
	}
	
	for(int i=1;i<=n;i++){
		cout<<c[i]<<" ";
	}
	return 0;
}