Codeforces Round 944 (Div. 4) G(思维 + 位运算性质)
题意
给定一个由
个非负整数组成的数组 。
如果,那么你就可以交换 ,其中, 是按位异或。
求出操作若干次后,字典序最小的序列。
数据范围:
题解
性质:
我们可以将 std::map
实现。
时间复杂度为
点击查看代码
#include <bits/stdc++.h>
using i64 = long long;
template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
f *= fu;
}
template <typename T>
void print(T x) {
if (x < 0) putchar('-'), x = -x;
if (x < 10) putchar(x + 48);
else print(x / 10), putchar(x % 10 + 48);
}
template <typename T>
void print(T x, char t) {
print(x); putchar(t);
}
const int N = 2E5 + 5;
int T, n, a[N];
std::map<int, std::priority_queue<int>> f;
void solve() {
read(n); f.clear();
for (int i = 1; i <= n; i++) {
read(a[i]);
}
for (int i = 1; i <= n; i++) {
f[a[i] ^ (a[i] & 3)].push(-a[i]);
}
for (int i = 1; i <= n; i++) {
print(-f[a[i] ^ (a[i] & 3)].top(), i == n ? '\n' : ' ');
f[a[i] ^ (a[i] & 3)].pop();
}
}
int main() {
read(T); while (T--) {
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步