1 条题解

  • 0
    @ 2026-5-5 19:37:21

    题目解析

    对于每个三元组 (ai,ai+1,ai+2)(a_i, a_{i+1}, a_{i+2}),要求满足:

    $$\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:mex=0\operatorname{mex} = 0

    此时左边为 00,右边为 maxmin\max - \min,因此:

    maxmin=0max=min\max - \min = 0 \quad\Rightarrow\quad \max = \min

    即三个数全部相等。
    又因为 mex=0\operatorname{mex}=0 说明 00 不在三元组中,所以这三个相等的数必须 非零

    结论:此时三元组形如 (x,x,x)(x, x, x),其中 x1x \ge 1

    情况 2:mex0\operatorname{mex} \neq 0

    mex=m1\operatorname{mex} = m \ge 1
    由于 00 是最小的非负整数,如果 00 不在三元组中,则 mex\operatorname{mex} 必定为 00,矛盾。因此 00 必须在三元组中,即:

    min([ai,ai+1,ai+2])=0\min([a_i, a_{i+1}, a_{i+2}]) = 0

    于是右边 maxmin=max0=max\max - \min = \max - 0 = \max,条件变为:

    m=maxm = \max

    m=mexm = \operatorname{mex} 的定义是 不在三元组中的最小非负整数,而 max\max 是三元组中的最大值,它一定出现在三元组中。因此 m=maxm = \max 意味着 max\max 不在三元组中,矛盾。

    所以 情况 2 不可能成立


    对整个数组的约束

    每一个长度为 33 的连续子数组都必须满足情况 1,即每个三元组都由相同的非零数构成。

    考虑相邻的三元组 (a1,a2,a3)(a_1, a_2, a_3)(a2,a3,a4)(a_2, a_3, a_4)

    • 由第一个三元组知 a1=a2=a3=xa_1 = a_2 = a_3 = xx1x \ge 1)。
    • 由第二个三元组知 a2=a3=a4=ya_2 = a_3 = a_4 = yy1y \ge 1)。
      于是 x=yx = y,所以 a4=xa_4 = x。依此类推,整个数组的所有元素必须 全部相等且非零

    处理缺失值(1-1

    • 如果数组中所有已知(非 1-1)的元素都相等且不等于 00,那么我们可以将每个 1-1 替换为这个相同的非零数(例如 11),这样整个数组就全部相等且非零,满足条件。
    • 如果已知元素中有两个不同的值,或者存在 00,则无论如何填充都无法使所有三元组都相等且非零,因此不可能。

    特别地,如果所有元素都是 1-1(没有已知值),我们可以全部填 11,也是可行的。


    算法步骤

    对于每个测试用例:

    1. 读取 nn 和数组 aa
    2. 收集所有 ai1a_i \neq -1 的值到列表 vv
    3. 如果 vv 为空,输出 "YES"
    4. 否则,检查 vv 中所有元素是否都等于某个 xx,并且 x0x \neq 0
      • 如是,输出 "YES"
      • 否则,输出 "NO"

    时间复杂度:O(n)O(n) 每个测试用例,满足 n100n \le 100


    代码实现(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
    上传者