比赛 集训 评测结果 AAAAAAAAAA
题目名称 遵循指令之意 最终得分 100
用户昵称 淮淮清子 运行时间 2.354 s
代码语言 C++ 内存使用 11.40 MiB
提交时间 2025-07-03 10:48:31
显示代码纯文本
#include<iostream>
#include<cstring>
using namespace std;

#define ll long long
const int MAXN = 1000005;

ll n;
ll a[MAXN];
ll odd[MAXN], even[MAXN];
ll tot1 = 0, tot2 = 0;
ll ans1 = 0, ans2 = 0;

void merge1(ll l, ll mid, ll r){
    ll i = l, j = mid + 1, k = 0;
    ll tmp[r - l + 1];
    while(i <= mid && j <= r){
        if (odd[i] <= odd[j]){
            tmp[k ++] = odd[i ++];
        }
		else{
            tmp[k ++] = odd[j ++];
            ans1 += mid - i + 1;
        }
    }
    while(i <= mid){
        tmp[k ++] = odd[i ++];
    }
    while(j <= r){
        tmp[k ++] = odd[j ++];
    }
    for(i = l, k = 0;i <= r;i ++, k ++){
        odd[i] = tmp[k];
    }
}

void qsort1(ll l, ll r){
    if (l >= r) return;
    ll mid = (l + r) / 2;
    qsort1(l, mid);
    qsort1(mid + 1, r);
    merge1(l, mid, r);
}

void merge2(ll l, ll mid, ll r){
    ll i = l, j = mid + 1, k = 0;
    ll tmp[r - l + 1];
    while(i <= mid && j <= r){
        if(even[i] <= even[j]){
            tmp[k ++] = even[i ++];
        }
		else {
            tmp[k ++] = even[j ++];
            ans2 += mid - i + 1;
        }
    }
    while(i <= mid){
        tmp[k ++] = even[i ++];
    }
    while(j <= r){
        tmp[k ++] = even[j ++];
    }
    for(i = l, k = 0; i <= r;i ++, k ++){
        even[i] = tmp[k];
    }
}

void qsort2(ll l, ll r){
    if (l >= r) return;
    ll mid = (l + r) / 2;
    qsort2(l, mid);
    qsort2(mid + 1, r);
    merge2(l, mid, r);
}

int main(){
	freopen("sort.in", "r", stdin);
	freopen("sort.out", "w", stdout);
    cin >> n;
    for(int i = 1;i <= n;i ++){
        cin >> a[i];
        if (i % 2 == 0){
            even[++ tot2] = a[i];
        }
		else{
            odd[++ tot1] = a[i];
        }
    }
    qsort1(1, tot1);
    qsort2(1, tot2);
    int index1 = 0, index2 = 0;
    if((ans1 % 2) == (ans2 % 2)){
    	for(int i = 1;i <= n;i ++){
			if(i % 2){
				cout << odd[++ index1] << ' ';
			}
			else{
				cout << even[++ index2] << ' ';
			}
		}
	}
	else{
		for(int i = 1;i <= n;i ++){
			if(i % 2){
				a[i] = odd[++ index1];
			}
			else{
				a[i] = even[++ index2];
			}
		}
		swap(a[n], a[n - 2]);
		for(int i = 1;i <= n;i ++){
			cout << a[i] << ' ';
		}
	}
    return 0;
}