CSP-S 2023 第二轮游记

发布时间 2023-10-22 18:15:36作者: cup11

Day 1

赛前

初赛 77 分过了,不多说,居然能排到前 10% 也是没想到的。去年参加过,但是因为某些原因复赛停办了。第一次正式参赛,比较紧张,也没啥经验。

主要说复赛。28分匆匆忙忙进了考场,然后看到极域“保持安静”经典界面,直接梦回小学三年级。因为模拟赛的时候也知道 4 小时着急也没啥用,所以也就慢慢得解压、打开虚拟机……

然而,该电脑还在用 Win7,甚至只有 4GB 内存,虚拟机也不知道怎么回事,重启了三遍才进去。用的时候也卡得要命,稍有不慎就卡死,等个一分钟是常态。

T1

终于,在 14:45 终于一切就绪,Arbiter 第一题也准备完毕。虽然想的不急,但还是有点急了,打好模板就直接开了 int arr[MAX_N]。写完一调,样例 1 输出了 2,什么鬼?再一看:

image

啊原来是每行包含五个整数啊,那没事了。

改改调调,再运行,啊?怎么还不到 20?再仔细一看样例解释,一个的方案有45种?这±1……等下,没说只能动 1 格啊,那没事了。

然后再仔细看了一下,题目原来是想说容不容易暴露密码啊,那就取交集呗。然后水了十分钟水过了。测了下样例 2 没问题,结果 Arbiter 说不对!我:啊?最后也就不管它了,不知道什么毛病。

image

T2

然而,这时已经 15:30 了。我只好加急做第二题。一看范围,这不就那个什么栈吗,做过的。(然而当时做了好久,也没彻底搞明白。)写了一堆状态,新字符如何转移,一运行,T2 差了一堆?噢原来是 aaaa 这种 8 个的因为栈被消成了 7 个,然后沿着原思路改……死活调不对……

不干了!直接摆烂拿暴力分。外层循环,内层开栈,\(O(n^2)\)摆烂!结果不出所料:

image

T3

诶哟这不大模拟吗?虽然只剩两个小时做这种题是一个非常错误的决定,但是因为对底层逻辑的追求,导致我花了一个半小时写了 4KB 代码,调了 20 分钟,结果最后输出的只有一堆

0 0
0 0
0 0
0 0
0 0

……

来不及了,随便吧。

T4

看了一眼,树啊,啊,来不及了。

尾声

摆好文件,收文件夹,上交。一个个上前确认,当听到别人都只有一题空着,而我被问的是“就这两个文件夹对吧”时,我有些崩溃了。

走出赛场,我知道这个和 1= 肯定无缘了,但还是看了下洛谷,看了下微信群。

在地铁上,我看到了特派员发出的全省代码公示,于是就打算回来开测。

Day 2

测出来就是 100+50+0+0 了。看了一下排行榜,大概 30% 的位置,连 2= 也有点悬吧。还好 NOIP 有一个指导教师保底,不然真就完蛋了。

附上代码

最后,摘下一些代码纪念我这 4 个小时(码风比较清奇见谅):

T1

struct Solution {
    string origin;
    unordered_set<string> mp, tmp, ans;

    char add(char ch) {
        return ch == '9' ? '0' : (ch + 1);
    }

    void check(bool isFirst) {
        for (size_t i = 0; i < 5; i++) {
            string s = origin;
            for (size_t j = 0; j < 9; j++) {
                s[i] = add(s[i]);
                mp.insert(s);
            }
        }
        for (size_t i = 1; i < 5; i++) {
            string s = origin;
            for (size_t j = 0; j < 9; j++) {
                s[i] = add(s[i]);
                s[i - 1] = add(s[i - 1]);
                mp.insert(s);
            }
        }
        if (isFirst) {
            ans.swap(mp);
        } else {
            for (const string& s : ans) {
                if (mp.count(s)) {
                    tmp.insert(s);
                }
            }
            ans.clear();
            tmp.swap(ans);
            mp.clear();
        }
    }
};

T2

struct Solution {
    stack<char> st;

    uint64_t solve() {
        uint64_t ans = 0;
        for (size_t i = 0; i < n; i++) {
            while (!st.empty()) {
                st.pop();
            }
            for (size_t j = i; j < n; j++) {
                if (st.empty()) {
                    st.push(arr[j]);
                } else if (st.top() == arr[j]) {
                    st.pop();
                } else {
                    st.push(arr[j]);
                }
                ans += uint64_t(st.empty());
            }
        }

        return ans;
    }
};

int main() {
    static Solution solution;
    cout << solution.solve() << endl;

    return 0;
}