1 条题解
-
0
题目解析
对于每个三元组 ,要求满足:
$$\operatorname{mex}([a_i, a_{i+1}, a_{i+2}]) = \max([a_i, a_{i+1}, a_{i+2}]) - \min([a_i, a_{i+1}, a_{i+2}]) $$分类讨论
情况 1:
此时左边为 ,右边为 ,因此:
即三个数全部相等。
又因为 说明 不在三元组中,所以这三个相等的数必须 非零。结论:此时三元组形如 ,其中 。
情况 2:
设 。
由于 是最小的非负整数,如果 不在三元组中,则 必定为 ,矛盾。因此 必须在三元组中,即:于是右边 ,条件变为:
但 的定义是 不在三元组中的最小非负整数,而 是三元组中的最大值,它一定出现在三元组中。因此 意味着 不在三元组中,矛盾。
所以 情况 2 不可能成立。
对整个数组的约束
每一个长度为 的连续子数组都必须满足情况 1,即每个三元组都由相同的非零数构成。
考虑相邻的三元组 和 :
- 由第一个三元组知 ()。
- 由第二个三元组知 ()。
于是 ,所以 。依此类推,整个数组的所有元素必须 全部相等且非零。
处理缺失值()
- 如果数组中所有已知(非 )的元素都相等且不等于 ,那么我们可以将每个 替换为这个相同的非零数(例如 ),这样整个数组就全部相等且非零,满足条件。
- 如果已知元素中有两个不同的值,或者存在 ,则无论如何填充都无法使所有三元组都相等且非零,因此不可能。
特别地,如果所有元素都是 (没有已知值),我们可以全部填 ,也是可行的。
算法步骤
对于每个测试用例:
- 读取 和数组 。
- 收集所有 的值到列表 。
- 如果 为空,输出
"YES"。 - 否则,检查 中所有元素是否都等于某个 ,并且 。
- 如是,输出
"YES"。 - 否则,输出
"NO"。
- 如是,输出
时间复杂度: 每个测试用例,满足 。
代码实现(C++ 风格)
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> a(n); vector<int> known; for (int i = 0; i < n; i++) { cin >> a[i]; if (a[i] != -1) known.push_back(a[i]); } bool ok = true; if (!known.empty()) { int val = known[0]; if (val == 0) ok = false; else { for (int x : known) { if (x != val) { ok = false; break; } } } } cout << (ok ? "YES" : "NO") << endl; } return 0; }
- 1
信息
- ID
- 6943
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者