题解:P16441 [XJTUPC 2026] 直播获奖

· · 题解

场上瞎写了一下居然过了。

模拟。

思路

按编号顺序逐个加入玩家,每次加入后重新筛选 AB 队。

使用有序集合维护玩家成绩降序,快速获取排名信息。

最后将两队分别升序输出。 ::::info[AC code]{} ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int> e(n + 1) , g(n + 1) , s(n + 1); for (int i = 1 ; i <= n ; ++i) { cin >> e[i] >> g[i] >> s[i]; } set<pair<int , int> , greater<>> a; set<pair<int , int> , greater<>> y , o; map<int , int> c; set<int> p , q; auto u = [&]() { p.clear(); q.clear(); int t = a.size(); if (t <= 4) { for (auto &k : a) { int id = k.second; p.insert(id); } } else { vector<int> f; auto it = a.begin(); for (int i = 0 ; i < 5 ; ++i) { f.push_back(it -> second); it ++; } bool h0 = false , h1 = false; for (int id : f) { if (e[id] == 0) { h0 = true; } if (e[id] == 1) { h1 = true; } } if (h0 && h1) { for (int id : f) { p.insert(id); } } else { int d = e[f[0]]; auto &m = d ? o : y; auto it2 = m.begin(); for (int i = 0 ; i < 4 && it2 != m.end() ; ++i) { p.insert(it2 -> second); it2 ++; } auto &r = d ? y : o; if (!r.empty()) { p.insert(r.begin() -> second); } } } for (auto &k : a) { int id = k.second; if (p.count(id)) { continue; } if (q.size() >= 12) { break; } int w = g[id]; int cur = 0; for (int u : p) { if (g[u] == w) { cur ++; } } for (int u : q) { if (g[u] == w) { cur ++; } } if (cur < 5) { q.insert(id); } } }; for (int i = 1 ; i <= n ; ++i) { a.insert({s[i] , i}); if (e[i] == 0) { y.insert({s[i] , i}); } else { o.insert({s[i] , i}); } u(); vector<int> res; for (int id : p) { res.push_back(id); } for (int id : q) { res.push_back(id); } sort(res.begin() , res.begin() + p.size()); sort(res.begin() + p.size() , res.end()); for (int j = 0 ; j < res.size() ; ++j) { if (j > 0) { cout << " "; } cout << res[j]; } cout << endl; } return 0; } ```