比赛 集训 评测结果 AAAAAAAAAA
题目名称 遵循指令之意 最终得分 100
用户昵称 OTTF 运行时间 2.491 s
代码语言 C++ 内存使用 21.35 MiB
提交时间 2025-07-03 08:39:53
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;

constexpr int N = 1919810;

int n;
vector<int> one;
vector<int> two;
long long tree[N];
vector<int> ress;

inline int lowbit (int id) {
	return id & (-id);
}

void add (int id, long long num) {
	for (; id <= n; id += lowbit (id)) {
		tree[id] += num;
	}
}

long long query (int id) {
	long long res = 0;
	for (; id; id -= lowbit (id)) {
		res += tree[id];
	}
	return res;
}

long long cal (vector<int>& vec) {
	long long res = 0;
	int i = 0;
	for (auto num : vec) {
		res += i - query (num);
		i++;
		add (num, 1);
	}
	return res;
}

int main () {
	
	freopen ("sort.in", "r", stdin);
	freopen ("sort.out", "w", stdout);

	cin >> n;
	int num;
	for (int i = 1; i <= n; i++) {
		cin >> num;
		if (i % 2) {
			one.push_back(num);
		}
		else {
			two.push_back(num);
		}
	}

	long long res1 = cal (one);
	memset (tree, 0, sizeof (tree));
	long long res2 = cal (two);

	sort (one.begin(), one.end());
	sort (two.begin(), two.end());

	for (int i = 1; i <= n; i++) {
		if (i % 2) {
			ress.push_back(one[i / 2]);
		}
		else {
			ress.push_back(two[i / 2 - 1]);
		}
	}

	if ((res1 % 2) != (res2 % 2)) {
		iter_swap (ress.rbegin(), ress.rbegin() + 2);
	}

	for (auto res : ress) {
		cout << res << ' ';
	}

	return 0;
}