P9525 [JOISC2022] 团队竞技 题解
题意:
给定 个三元组 ,求 且 互不相等,满足 ,最大化 。
考虑如果没有 的限制,我们显然分别取 最大的三个。然而直接取这三个可能会违反这个限制。
具体的, 中必然有一个 中有大于等于 个值都是 中最大的。比如对于 ,。此时 已经选到了 的最大值,故怎么选,都有 。于是只要选了 ,就无法选出这一组 。接着把 删了,递归成一个 的子问题。维护 priority_queue 即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n;
struct Node
{
int a, b, c;
Node(int a, int b, int c): a(a), b(b), c(c){}
Node(){}
}p[N];
bool del[N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> p[i].a >> p[i].b >> p[i].c;
}
priority_queue<pair<int, int>> p1, p2, p3;
for (int i = 1; i <= n; i++)
{
p1.push(make_pair(p[i].a, i));
p2.push(make_pair(p[i].b, i));
p3.push(make_pair(p[i].c, i));
}
for (int i = 1; i <= n; i++)
{
while (p1.size() && del[p1.top().second]) p1.pop();
while (p2.size() && del[p2.top().second]) p2.pop();
while (p3.size() && del[p3.top().second]) p3.pop();
vector<pair<int, Node>> vv;
vv.emplace_back(make_pair(p1.top().second, p[p1.top().second]));
vv.emplace_back(make_pair(p2.top().second, p[p2.top().second]));
vv.emplace_back(make_pair(p3.top().second, p[p3.top().second]));
//cout << i << " " << p1.top().second << " " << p2.top().second << " " << p3.top().second << "\n";
for (int j = 0; j < 3; j++)
{
int c = 0;
bool fg = 1;
for (int k = 0; k < 3; k++)
{
if (j == k) continue;
fg &= (vv[j].second.a >= vv[k].second.a);
}
c += fg;
fg = 1;
for (int k = 0; k < 3; k++)
{
if (j == k) continue;
fg &= (vv[j].second.b >= vv[k].second.b);
}
c += fg;
fg = 1;
for (int k = 0; k < 3; k++)
{
if (j == k) continue;
fg &= (vv[j].second.c >= vv[k].second.c);
}
c += fg;
if (c >= 2)
{
del[vv[j].first] = 1;
goto E;
}
}
cout << max({vv[0].second.a, vv[1].second.a, vv[2].second.a}) + max({vv[0].second.b, vv[1].second.b, vv[2].second.b}) + max({vv[0].second.c, vv[1].second.c, vv[2].second.c}) << "\n";
return 0;
E:;
}
cout << "-1\n";
return 0;
}

浙公网安备 33010602011771号