1 条题解

  • 0
    @ 2026-6-19 10:30:28

    📝 题目大意

    NN 名选手,依次发生 QQ 个事件:出示黄牌、出示红牌、或询问某选手是否已被退场。选手累计 2 张黄牌或收到 1 张红牌即被退场。对每个询问输出 YesNo

    💡 解题思路

    1. 题目分析N,Q100N, Q \leq 100,数据量极小,直接模拟即可。题目保证已退场的选手不会再收到牌,因此无需额外判断。
    2. 算法推导
      • 用一个数组 a[i] 记录选手 ii 的"罚分"累计值。
      • 黄牌 +1+1,红牌 +2+2(如 std.cppa[x]++a[x] += 2)。
      • 这样,当 a[x] >= 2 时,要么是两次黄牌(1+1=21+1=2),要么是一张红牌(0+2=20+2=2),恰好对应退场的两种条件。用一个阈值 22 统一判断,避免了分别维护黄牌计数和红牌标记的冗余。
    3. 边界与细节
      • 数组大小至少开到 N+1N+1NN 最大 100100std.cpp 开到 105105)。
      • 询问时判断 a[x] < 2 输出 No,否则 Yes

    ⏱️ 复杂度分析

    • 时间复杂度O(Q)O(Q),每个事件 O(1)O(1) 处理。
    • 空间复杂度O(N)O(N),用于存储罚分数组。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int n, q, op, x, a[105];  // a[i] 记录选手 i 的罚分累计
    
    int main () {
        scanf("%d%d", &n, &q);
        while (q--) {
            scanf("%d%d", &op, &x);
            if (op == 1)        // 黄牌:罚分 +1
                a[x]++;
            else if (op == 2)   // 红牌:罚分 +2(直接 >= 2,触发退场)
                a[x] += 2;
            else {              // 询问:罚分 >= 2 即已退场
                if (a[x] < 2)
                    printf("No\n");
                else
                    printf("Yes\n");
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    684
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者