CSP2024 游记

Ethan1201

2024-11-02 22:42:44

Life & Travel

CSP2024 游记(CSP-J2)

《2024 CSP-J2 游寄》

蒟蒻作者声明:本游记暂只包括J组复赛经历。

Update

第一更:2024.11.2 19:35

正文

本蒟蒻的信竞生涯为可怜的一年多一点,就被搞去参加了CSP。特别的凄惨。其中我的信竞生涯初期还是自学的,后面一直恶补,在跟着教练的同时自己偷偷卷......

坐标:GD-SZ

Season 2022-2023

升级打怪ing(本蒟蒻刚开始信竞)。。。

Season 2023-2024

崭新的2024赛季开始了。这也是我信竞生涯开始的一周年。

4.4~4.6:在紫堡OI团队里面进行了为期3天的清明集训,并举办了内部IOI赛制的5场比赛,见识了集团里面的各位神犇(如 @luoguhandongheng 等),被虐爆了(虽然没有爆0,还AK了一场,但还是纯纯一枚蒟蒻)。

4.Mid~7.14 学科,其中掺杂着参加了ZB杯,进了复赛以后又被虐爆了。。。然后备考期末,冲集团前十。

7.15~8.31 暑假集训,去中心校区,每天一个上午加一个下午,讲课老师进度又快得要命,我这种蒟蒻根本跟不上,度日如年,生不如死(绿题让我们自学)。

9.21 CSP2024 初赛,仍然在中心校区,J组和S组初赛稳稳过掉(我J组初赛考得竟然比我们学校一大佬还高,96.5,虽然没啥用,但还是庆祝一下),在10点左右捞了2分回来,美滋滋;又在还剩10分钟交卷时捞了1.5分,美滋滋2.0;S组压线过,61。

10.1-10.7 国庆集训,但只参加了一半,因为还有别的比赛。

10.8-10.24 每天在SGY的中午不午睡了,跑去机房刷题(上分),但晚上已经没时间刷题,备战期中考。

10.25 心里奇慌,刚学一年就考CSP。

正文2.0

2024.10.26 CSP-J2/S2

早上5:00起床,带着惺忪睡眼坐地铁到了高中园,到了之后拍了照,又坐在校门口的凳子上缓一会儿。

6:30 到达考场。

7:00-7:20 准备考前注意事项,复习Windows 和 NOI Linux 2.0虚拟系统的使用方法。

7:30 进入考点,找到了我的同学&大佬 @xiaowr XWR,然后坐在大堂内,我俩都在创新高中考。

8:00 前往考场,进入考场(之前提到的那位大神路过)。 CCF实在令人可恶,不允许带纸巾进去,对鼻炎患者极度不友好(我那个考场也有一位是这样)。

8:00-8:30 签完《CSP-J/S诚信考试及知情同意书》,才知道可以用Windows......(之前一直在练Linux)于是直接关掉虚拟机,然后在等发解压码之前开了4个程序,在Dev-C++上面打了个模版。

8:30 CSP-J2开始,解压码发了出来,开始看题。

2024 CSP-J2 T1

看到那么多的扑克牌图片,人都傻了,当时心里想CCF真狠,T1 就搞大的,以为很难,结果一细看,纯纯map练习题,直接判断一下是否标记过,没标记过的就标记,并从52张牌中减少一张需要拿的牌,标记过的不管。

#include <bits/stdc++.h>
using namespace std;

map<string, int> mp;
signed main(){
    //freopen("poker.in", "r", stdin);
    //freopen("poker.out", "w", stdout);
    int n;
    long long sum = 0;
    cin >> n;
    for (int i = 1; i <= n; i++){
        string str;
        cin >> str;
        if (mp[str] == 0) sum++;
        mp[str] = 1;}
    cout << 52 - sum;

    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

15分钟成功秒掉

2024 CSP-J2 T2

8:55 看了半天的题面,一开始以为是一道模拟题,但后面发现一道纯简单DFS搜索题,但有点不放心,模拟也测了一遍,然后还是用的DFS, 用vis数组标记了一下,写出了如下代码:(小插曲,就是 printf 压根没往文件里输出,估计是没清空缓存,手动清了一下,过了)

简单DFS搜索版

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;

const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
char a[1010][1010];
bool vis[1010][1010];

signed main(){
    //freopen("explore.in", "r", stdin);
    //freopen("explore.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int T;
    cin >> T;
    while (T--){
        memset(vis, 0, sizeof(vis));
        int n, m, k;
        cin >> n >> m >> k;
        int x, y, d;
        cin >> x >> y >> d;
        for (int i = 1; i <= n;i++)
            for (int j = 1; j <= m;j++)
                cin >> a[i][j];
        vis[x][y] = 1;
        while (k--){
            int xx = x + dx[d], yy = y + dy[d];
            if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[xx][yy] == '.'){
                x = xx;
                y = yy;
                vis[xx][yy] = 1;}
            else
                d = (d + 1) % 4;}
        int ans = 0;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (vis[i][j])
                    ans++;

        cout << ans << endl;}

    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

赛后总结的时候发现,T2 这道题直接按题意模拟就行了,没必要用搜索,于是又在家里修改出了代码:

模拟

#include <bits/stdc++.h>
#define int long long
using namespace std;

bool vis[1005][1005];
char ch[1005][1005];
const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

void solve(){
    //freopen("explore.in", "r", stdin);
    //freopen("explore.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, m, k, x0, y0, d0;
    memset(vis, 0, sizeof(vis));
    cin >> n >> m >> k;
    cin >> x0 >> y0 >> d0;
    for (int i = 1; i <= n; i++) {
        char s[1005];
        cin >> s;
        for (int j = 1; j <= m; j++)
            ch[i][j] = s[j - 1];}
    vis[x0][y0] = true;
    for (int i = 1; i <= k; i++) {
        int x1 = x0 + dx[d0], y1 = y0 + dy[d0];
        if (1 <= x1 && x1 <= n && 1 <= y1 && y1 <= m && ch[x1][y1] == '.') {
            x0 = x1;
            y0 = y1;}
        else
            d0 = (d0 + 1) % 4;
        vis[x0][y0] = true;}
    int ans = 0;
    for (int i = 1; i <= n; i++) 
        for (int j = 1; j <= m; j++)
            ans += vis[i][j];
    cout << ans << endl;
}

signed main() {
    int T;
    cin >> T;
    while (T--) 
        solve();

    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

然后测了测大样例,发现最后一个跑不过,我寻思着是不是TLE了,于是,我考场上就想了一个奇怪的假优化方法,调了有点久,才把样例重新过掉,然后发现,大样例还是跑不过。我看时间耗得略微有点久,我就跳题看下一题了,等最后写完所有题再回来看。最后回来看了这一题,代码最后改成了上面的样子。 还好最后应该改对了。

2024 CSP-J2 T3

9:40 T3 先打了个爆搜,骗个 10 \text{pts} 再说,然后看到了特殊性质 A,能被 7 整除不就是全是 8 吗?拿到 40 \text{pts}。再看特殊性质 B,想了想应该是 10888888...之类的,预估 70 \text{pts}

9:50 想了一下,其他的应该也是XX8888888...之类的,就有了 n \text{mod} 7 的逻辑和思路,最后也不知道到底多少分。

10:34 调出代码,不知道大概多少分,可能70 \text{pts} 左右。

一种比较奇怪的方法

#include <bits/stdc++.h>
#define int long long
using namespace std;

int nd[1005] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int minn[105];

void work(){
    int n; cin>>n;
    if (n==1){
        cout << "-1\n";
        return;}
    string ans;
    while (n > 21){
        n -= 7;
        ans.push_back('8');}
    cout << minn[n] << ans << '\n';
}

signed main(){
    //freopen("sticks.in", "r", stdin);
    //freopen("sticks.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    for (int i = 1; i <= 999; i++){
        nd[i] = nd[i % 10];
        if (i > 9) nd[i] += nd[i / 10];
        if (!minn[nd[i]]) minn[nd[i]] = i;}
    int T; cin >> T;
    while (T--) work();

    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

调完之后有点慌。

2024 CSP-J2 T4

看了一眼题目,觉得dp(动态规划思路)可以做,建图也应该可以,但是还是有点不会做(蒟蒻本性)。可以直接总司令。

因此打算骗分。看到第 2, 3 个数据点范围很小考虑爆搜骗点分,写了半天愣是过不了样例,调了半天。考场感觉是蓝题,但一开始竟然是绿题(后面改蓝了)。有点小意外。

11:10 代码调出来了,预估5-10 \text{pts}

11:20 实在太无聊,想写 C++ 小游戏又没时间 (赛后才知道可以在 Microsoft 玩 Surf,以为考试不能玩)。

11:30-11:50 检查代码,尝试优化。

11:50 检查防止爆0,cheaker.exe 表示你没毛病。

最后一点点时间,回去看T3,还是找不到为啥爆掉(总之我感觉T3爆了),时间复杂度是 O(T(n + 10^3)) ,后面查询的时候直接查表,时间复杂度为 O(10^3 + Tn) ,最后就这样吧。希望 CCF 的数据水一点 TwT。