题解:P16441 [XJTUPC 2026] 直播获奖
xiaozhengguoaaa
·
·
题解
场上瞎写了一下居然过了。
模拟。
思路
按编号顺序逐个加入玩家,每次加入后重新筛选 A、B 队。
使用有序集合维护玩家成绩降序,快速获取排名信息。
最后将两队分别升序输出。
::::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;
}
```