CSP-S 2023 第二轮游记
Day 1
赛前
初赛 77 分过了,不多说,居然能排到前 10% 也是没想到的。去年参加过,但是因为某些原因复赛停办了。第一次正式参赛,比较紧张,也没啥经验。
主要说复赛。28分匆匆忙忙进了考场,然后看到极域“保持安静”经典界面,直接梦回小学三年级。因为模拟赛的时候也知道 4 小时着急也没啥用,所以也就慢慢得解压、打开虚拟机……
然而,该电脑还在用 Win7,甚至只有 4GB 内存,虚拟机也不知道怎么回事,重启了三遍才进去。用的时候也卡得要命,稍有不慎就卡死,等个一分钟是常态。
T1
终于,在 14:45 终于一切就绪,Arbiter 第一题也准备完毕。虽然想的不急,但还是有点急了,打好模板就直接开了 int arr[MAX_N]
。写完一调,样例 1 输出了 2,什么鬼?再一看:
啊原来是每行包含五个整数啊,那没事了。
改改调调,再运行,啊?怎么还不到 20?再仔细一看样例解释,一个的方案有45种?这±1……等下,没说只能动 1 格啊,那没事了。
然后再仔细看了一下,题目原来是想说容不容易暴露密码啊,那就取交集呗。然后水了十分钟水过了。测了下样例 2 没问题,结果 Arbiter 说不对!我:啊?最后也就不管它了,不知道什么毛病。
T2
然而,这时已经 15:30 了。我只好加急做第二题。一看范围,这不就那个什么栈吗,做过的。(然而当时做了好久,也没彻底搞明白。)写了一堆状态,新字符如何转移,一运行,T2 差了一堆?噢原来是 aaaa
这种 8 个的因为栈被消成了 7 个,然后沿着原思路改……死活调不对……
不干了!直接摆烂拿暴力分。外层循环,内层开栈,\(O(n^2)\)摆烂!结果不出所料:
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;
}