Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38402 沈仲恩 【S】T2 C++ 通过 100 567 MS 34496 KB 1262 2025-10-03 19:17:12

Tests(88/88):


#include <bits/stdc++.h> using namespace std; int n, a[300005], mp[300005], lm[300005]; vector <int> ps[300005]; set <pair <int, int> > sz, lft; int lst = 0; inline void del(int x) // x: color { if (x == lst) { auto it = lft.begin(); it++; x = it -> second; } int i = lm[x]; lst = x; printf("%d ", i); sz.erase({mp[x], x}); lft.erase({i, x}); ps[x].pop_back(); mp[x]--, lm[x] = ps[x].back(); if (mp[x]) sz.insert({mp[x], x}), lft.insert({lm[x], x}); } signed main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]), mp[a[i]]++; for (int i = n; i >= 1; i--) ps[a[i]].emplace_back(i); for (int i = 1; i <= n; i++) if (mp[i]) sz.insert({mp[i], i}), lft.insert({ps[i].back(), i}), lm[i] = ps[i].back(); if (sz.rbegin() -> first > (n >> 1) + (n & 1)) { puts("-1"); return 0; } for (int i = 1; i <= n; i++) { int cur = lft.begin() -> first, rem = n - i + 1; if (sz.rbegin() -> first == (rem >> 1) + (rem & 1) && (rem & 1)) del(sz.rbegin() -> second); else del(a[cur]); } return 0; }


测评信息: