CSP-S 2023 游记 & 总结 & 题解

发布时间 2023-10-23 21:21:21作者: User-Unauthorized

游记

到了机房发现是 Windows10,感觉不错。

比赛开始果断启动虚拟机,怎么今年PDF密码这么复杂啊,我记得去年挺简单的来着,好像是 believe2022

看了一遍题,有理由怀疑 T1 是 J 的题,但是一开始读错了,以为只能转一下,后来计算转动幅度的时候忘记对 \(10\) 取模,怒调 1h。

T2 一开始以为是容斥 DP,胡了一发上去发现不对,来来回回打了 \(7\) 版,结束后距离考试结束仅剩 \(1\) 小时。

开始浏览 T3 和 T4,感觉 T4 是二分答案后计算出每棵树最晚什么时候被种下,然后贪心的去种,二分答案 + 树剖 + 二分一次函数,感觉代码难度高于 T3,于是走上了 T3 的不归路。

赛后发现 T4 的思路稍加优化便是正解,有些痛心,但是好像赛时去打也打不完?

总结

前两题做的太慢,代码能力低下。

题解

消消乐

考虑一个 \(\mathcal{O}(n^3)\) 的暴力,首先 \(\mathcal{O}(n^2)\) 地枚举子串,使用一个栈,然后遍历这个子串,若字符与栈顶相同则弹出栈顶,否则将字符压入栈中。遍历完后子串合法当且仅当栈为空。

发现可以 \(\mathcal{O}(n)\) 地枚举起点然后计算期间栈为空的次数,这样可以做到 \(\mathcal{O}(n^2)\)

考虑进一步优化,可以发现若从 \(l\) 开始到 \(r\) 时栈为空,若我们从 \(1\) 开始遍历字符串,那么遍历至 \(l, r\) 时的栈相同,故可以导出结论区间 \([l, r]\) 合法当且仅当这两个位置的栈相同,对栈使用 \(\tt{hash}\) 即可,复杂度 \(\mathcal{O}(n \log n)\),可以通过。

种树

首先二分答案,下面考虑如何判定。

发现可以对于每棵树计算出其最晚何时被种下才能符合要求,那么按此标准贪心即可。

发现若一个节点被种下,那么其所有祖先节点也一定被种下,故在模拟种树的过程中可以直接暴力跳到第一个种过树的祖先节点后返回,由于每个节点最多被访问 \(1\) 次,故这部分的复杂度为 \(\mathcal{O}(n)\)

计算最晚时间时需要二分值域,故总复杂度为 \(\mathcal{O}(n \log V\left(\log V + \log n\right))\)