题解:ARC222B Circular RPS

诡异。

设三种手势分别为 \(\texttt{R},\texttt{S},\texttt{P}\)。分类讨论获胜的人中有几种手势。

\(1\) 种手势

不妨设获胜的人都出 \(\texttt{R}\),这些人的两边必须都出 \(\texttt{S}\)

\(n\) 为偶数且 \(\texttt{R},\texttt{S}\) 各有 \(\dfrac n2\) 个,则可以将 \(\texttt{R},\texttt{S}\) 交替排列,答案为 \(\dfrac n2\)

否则设答案为 \(x\),则 \(a\geq x\),而除了 \(x\)\(\texttt{R},\texttt{S}\) 以外的人,需要多花费一个 \(\texttt{S}\) 把他们包裹在两个 \(\texttt{S}\) 中间,因此 \(b\geq x+1\)。此时答案为 \(\min(a,b-1)\)

\(2\) 种手势

不妨设获胜的人都出 \(\texttt{R}\)\(\texttt{S}\)。出 \(\texttt{R}\) 的人要获胜两边必须出 \(\texttt{S}\),显然这些 \(\texttt{S}\) 不会胜利。出 \(\texttt{S}\) 的人要获胜两边必须出 \(\texttt{P}\)。设获胜的人中有 \(x\) 个出 \(\texttt{R}\)\(y\) 个出 \(\texttt{S}\),则

\[\begin{cases} a\geq x\\ b\geq x+y+1\\ c\geq y+1 \end{cases} \Leftrightarrow x+y\leq \min(a+c-1,b-1) \]

构造是容易的:

\[\texttt{S}\ \texttt{R}\ \texttt{S}\cdots\texttt{R}\ \texttt{S}\quad \texttt{P}\ \texttt{S}\ \texttt{P}\cdots\texttt{S}\ \texttt{P} \]

这种情况答案为 \(\min(a+c-1,b-1)\)。注意这里要求 \(a\geq 1\land b\geq 3\land c\geq 2\)

\(3\) 种手势

设获胜的人中有 \(x\) 个出 \(\texttt{R}\)\(y\) 个出 \(\texttt{S}\)\(z\) 个出 \(\texttt{P}\),则

\[\begin{align*} a&\geq x+z+1\\ b&\geq x+y+1\\ c&\geq y+z+1 \end{align*} \]

\(x'=x-1\)\(y'=y-1\)\(z'=z-1\),则相当于

\[\begin{align*} x'+z'&\leq a-3\\ x'+y'&\leq b-3\\ y'+z'&\leq c-3 \end{align*} \]

其中 \(x',y',z'\geq 0\)

取若干必要条件,容易得出

\[x'+y'+z'\leq\min \begin{cases} a+b-6\\ a+c-6\\ b+c-6\\ \left\lfloor\dfrac{a+b+c-9}{2}\right\rfloor \end{cases} \]

设这个上界为 \(M\),我们证明 \(x'+y'+z'\) 可以取到 \(M\)

证明

将限制转化为

\[\begin{align*} y'&\geq M-(a-3)\\ z'&\geq M-(b-3)\\ x'&\geq M-(c-3) \end{align*} \]

由于 \(2M\leq (a-3)+(b-3)+(c-3)\),这三个下界之和满足

\[3M-(a-3)-(b-3)-(c-3)\leq M \]

所以一定存在满足 \(x'+y'+z'=M\) 的分配方案。\(\Box\)

这种情况答案为

\[3+\min \begin{cases} a+b-6\\ a+c-6\\ b+c-6\\ \left\lfloor\dfrac{a+b+c-9}{2}\right\rfloor \end{cases} \]

注意这里要求 \(a\geq 3\land b\geq 3\land c\geq 3\)


直接实现即可。单个测试数据时间复杂度为 \(\mathcal{O}(1)\)

代码
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using i128 = __int128;
using ui = unsigned int;
using ull = unsigned long long;
using u128 = unsigned __int128;
using ld = long double;
using pii = pair<int, int>;

template<typename T> T lowbit(T x) { return x & -x; }
template<typename T> void chkMin(T &x, T y) { x = y < x ? y : x; }
template<typename T> void chkMax(T &x, T y) { x = x < y ? y : x; }

int tc;
ll a[3];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> tc;
	while (tc--) {
		for (int i = 0; i < 3; ++i) cin >> a[i];
		ll sum = a[0] + a[1] + a[2], ans = 0;
		for (int i = 0; i < 3; ++i) {
			ll cur = a[i], nxt = a[(i + 1) % 3], nxt2 = a[(i + 2) % 3];
			if (~sum & 1 && cur == (sum >> 1) && nxt == (sum >> 1))
				chkMax(ans, sum >> 1);
			chkMax(ans, min(cur, nxt - 1));
			if (cur >= 1 && nxt >= 3 && nxt2 >= 2)
				chkMax(ans, min(nxt - 1, cur + nxt2 - 1));
		}
		if (min({a[0], a[1], a[2]}) >= 3) {
			ll x = a[0] - 3, y = a[1] - 3, z = a[2] - 3;
			chkMax(ans, min({x + y + z >> 1, x + y, x + z, y + z}) + 3);
		}
		cout << ans << '\n';
	}
	return 0;
}
posted @ 2026-06-18 19:09  P2441M  阅读(11)  评论(0)    收藏  举报