TB椰程 TypeBuddy 打字搭子

2025-12 · 8级 · 宝石项链

GESP 标程 · 考级真题 · 代码 · cpp · 难度 5/5 · 共 1392 字

CCF 原卷官方标程 · 结构体与类、位运算、复杂度 · 本地编译通过

  • 2025-12
  • 结构体与类

正文

// GESP 2025-12 C++ 8级 编程题 2 · 宝石项链
// 原题:https://oj.yecheng.tv/p/gs2512l8p2
// 官方原卷:https://gesp.ccf.org.cn/101/attach/1723013038866464.pdf
// 题意:小 A 有一串包含枚宝石的宝石项链,这些宝石按照在项链中的顺序依次以编号,第枚宝石与第枚宝石相邻。
// 知识点:结构体与类、位运算、复杂度
// 参考程序:CCF 原卷官方标程,PDF 抽取后已去行号;本地编译核验通过,供打字练习
// 原卷样例验证:样例验证 2/2 通过
//
#include <cstdio>
#include <algorithm>
using namespace std;
const int L = 20;
const int N = 2e5 + 5;
const int oo = 1e9;
int n, m;
int t[N], jump[L][N];
int cnt[N], tot;
int ans;
int go(int u) {
    int cnt = 0, ans = 0;
    for (int i = L - 1; i >= 0; i--)
        if (cnt + jump[i][u] <= n) {
            cnt += jump[i][u];
            ans += 1 << i;
            u = (u + jump[i][u] - 1) % n + 1;
        }
    return ans;
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &t[i]);
        t[i + n] = t[i];
    }
    for (int i = 1, r = 0; i <= n; i++) {
        while (tot < m) {
            r++;
            if (!cnt[t[r]]++)
                tot++;
        }
        jump[0][i] = r - i + 1;
        if (!--cnt[t[i]])
            tot--;
    }
    for (int i = 1; i < L; i++)
        for (int j = 1; j <= n; j++) {
            int tar = (j + jump[i - 1][j] - 1) % n + 1;
            jump[i][j] = min(jump[i - 1][j] + jump[i - 1][tar], oo);
        }
    for (int i = 1; i <= n; i++)
        ans = max(ans, go(i));
    printf("%d\n", ans);
    return 0;
}

GESP 标程 · 考级真题的其它内容

打字首页 · 英语学习中心 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK