CSP 2023 游记

终于想起来

好吧,鸽了怎么久,还是要来写一下的

初赛

赛时

初赛那天上午,我很早就到了广大附。走进去之后,发现一个 TYOIer 都没有,然后就在门口等队友。吹着上午凛冽的秋风,等啊等,发现他们怎么一直不来啊啊啊啊啊。等到离可以进考场还有 \(5\) 分钟的时候,我就自己走进去了,孤独,又无助。

后来等到考试快要开始,我们的其他队员才陆陆续续地到,听说是因为堵车了(笑死)。

对于早上入门组的初赛,我个人感觉是很好的(但是后来并不这么认为),除了哈夫曼编码的那道选择题和最后一道二分码风很不习惯之外。感觉轻松过线。心情好的一批 。

中午去广工食堂吃饭,感觉比铁一的要好吃太多!顺便买了一杯蜜雪冰城,甚至他还帮我打多了一杯,后来退钱了。

下午的提高组比赛,感觉难度略有提升,但是程序填空题终于有正经算法啦啦啦啦啦!做起来也是相当舒服。

赛后

赛后发现自己成为最大 joker ,入门组 \(63 \rm pts\) ,提高组 \(68 \rm pts\) 。笑死,入门组差点全班最低,提高组全班最高。被嘲讽只会打提高(他们开玩笑说我打到 AKIOI 都拿不到入门组一等奖)

不过理性分析一下,还是因为程序填空那个二分奇特的书写风格,真的对我误导很大啊啊啊!

复赛

由于我是一个人才,所以无缘了入门组,只能打提高了。

那天下午天气不是很好,刚下完雨,路上很湿滑。我们到广大附门口集中,老师给每个人都派了一个红包,感觉是送死前的最后一丝安慰(尽管我直到比赛结束都没有打开它)。

进去先签了一份 CCF 的协议书,然后开赛!

赛时

T1

感觉 T1 是一个一眼题,一眼 Mid in the middle。想了大约 5 分钟,意识到好像这题随便搞一下多重循环加超级特判就可以在有 \(8\) 倍常数的 \(O(10^n)\) 下通过了。事实也确实如此。轻松拿下 T1,感觉去年的题目水很多,信心拉满。

顺便附上我丑陋的赛时代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <map>
#include <set>

#define int long long
#define endl '\n'

using namespace std;

int n;
string a[10];
set<string> s;
map<string, bool> mp[10];

int calc(int x) {
while (x < 0) {
x += 10;
}
while (x > 9) {
x -= 10;
}
return x;
}

string work(string ori, int pos, int turn, int len) {
if (len == 1) {
ori[pos] = calc(ori[pos] - '0' + turn) + '0';
} else if (len == 2) {
ori[pos] = calc(ori[pos] - '0' + turn) + '0';
ori[pos + 1] = calc(ori[pos + 1] - '0' + turn) + '0';
}
return ori;
}

void search(int p, string s) {
for (int i = 0; i < 5; i++) {
for (int j = 1; j <= 9; j++) {
if (i < 4) {
// if (s[i] + j <= '9' && s[i + 1] + j <= '9') {
string sp = work(s, i, j, 2);
mp[p][sp] = true;
::s.insert(sp);
// cout << s << " " << i << " " << j << " " << sp << endl;
// }
// if (s[i] - j >= '0' && s[i + 1] - j >= '0') {
sp = work(s, i, -j, 2);
mp[p][sp] = true;
::s.insert(sp);
// cout << s << " " << i << " " << j << " " << sp << endl;
// }
}
// if (s[i] + j <= '9') {
string sp = work(s, i, j, 1);
mp[p][sp] = true;
::s.insert(sp);
// cout << s << " " << i << " " << j << " " << sp << endl;
// }
// if (s[i] - j >= '0') {
sp = work(s, i, -j, 1);
mp[p][sp] = true;
::s.insert(sp);
// cout << s << " " << i << " " << j << " " << sp << endl;
// }
}
}
}

signed main() {
// freopen("lock.in", "rt", stdin);
// freopen("lock.out", "wt", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
char ch;
for (int j = 0; j < 5; j++) {
cin >> ch;
a[i] += ch;
}
search(i, a[i]);
}
int ans = 0;
for (string i: s) {
// cout << i << " " << mp[i] << endl;
bool p = true;
// cout << i << endl;
for (int j = 1; j <= n; j++) {
p &= mp[j][i];
// cout << j << " " << (mp[j][i] ? "yes" : "no") << endl;
}
ans += p;
}
cout << ans;
}

T2

看起来像是 DP,但是不知道怎么搞。写了一个暴力+特殊性质拿下 \(35\rm pts\)

T3

感觉就是一个大模拟(尽管后来我知道需要一定的优化),直接开打!打了半个小时,发现理解错题意_(¦3」∠)_。没办法,Ctrl-a + Backspace。重新打,还是遇到了一些问题,好在都很容易发现,简单调了 \(20\) 分钟的样子,过了几乎所有样例(最后一个 TLE+MLE,直接让电脑死机半个小时)。很不幸的是,我的电脑在运行最后一个样例的时候爆内存了,直接死机半个小时。而且我 T4 题面一点没看,大寄特寄。最终估分 \(0\)

T4

开 T4 的时候比赛还剩下 \(45\) 分钟,感觉有点慌。看了一眼题目,感觉暴力的难度和码量应该不低于正解,由于太菜,根本不想写。看了一眼特殊性质,感觉也很难入手。不过,转念一想,就 CCF 的数据强度,随便乱搞说不定能一点点分数。于是我首先假设所有的数从第一天开始就一直在长,然后依题意一直模拟,直到出现答案。但是还有一个特判,就是如果计算的次数过多(即将 TLE),直接输出当前答案加上一个随机数。预估 \(0 \rm pts\)

赛后

不出所料,CCF 的高质量数据成功的让我的 T4 乱搞代码拿到了 \(10 \rm pts\) 的好成绩。T3 也出人意料的通过了所有的特殊性指点,以 TLE \(65\rm pts\) 的震惊成绩让我十分佩服今年 CCF 的出题人。T1、T2 发挥的十分异常,居然一分都没有周,最终超常发挥总分 \(210\) 拿下一等。

总结一下,我爱 CCF这场比赛数据还是水了点,然后就是 T3 的大模拟我很满意,十分符合我的胃口。一年就拿下提高一等还是很爽的,顺带附赠了 NOIP 的入场券,大喜!


CSP 2023 游记
https://lixuannan.github.io/posts/13733.html
作者
CodingCow Lee
发布于
2023年12月5日
许可协议