Loading

【游记】CSP-S2021 游记

今年还是在师大考,一样的机房。

提前 15 分钟进场,敲了个 gedit 配置就发题了。

开题,发现 T1 貌似一眼,用栈维护第 \(i\) 个廊桥装哪些飞机,然后求个前缀和即可,最后枚举国内和国外分几个廊桥更新答案。

然后看 T2,感觉一样的水,直接记 \(f_{l,r}\) 表示区间 \([l,r]\) 为合法串的方案数。

然后看 T3,没有感觉。打算先把 T3 想出来再开始写代码。

第一感觉是 \(b_n=b_{n+1}\),然后枚举这一位就行,显然只要满足 \(a_i = a_{n + i}\) 即可,然后其余的直接贪心推即可 \(\mathcal{O}(N)\)

开始码 T1,写了半个小时发现直接用栈假了,因为栈内的数不单调,所以我们要支持单点修改,查询第一个 \(<k\) 的位置,貌似是线段树上二分,大概 3:30 的时候过大样例。

接着码 T2,先打算写一个 \(\mathcal{O}(N^4)\) 的记搜,码了 80 行过了第一个样例,结果第二个样例一直输出 \(30\),非常诡异没有找到原因。

调了快一个小时没有找到问题,随便手敲几个数据,结果 \(6\)\(?\) 就卡掉了,想了一下发现直接转移会算重,\(()()()\) 这样的串会被算两次。

多开一个状态 \(g_{l,r}\) 表示区间 \([l,r]\) 为合法串,且 \(s_l\)\(s_r\) 匹配的方案数。

码完后发现是 \(\mathcal{O}(N^4)\) 的复杂度显然 TLE,观察一下可以后缀和,记 \(w_{i,j} =\sum\limits_{k\ge i}f_{i,j}\) 即可,写完发现已经 5:30 了。

还有两题有点慌,翻了下 T4 发现没有感觉,先写 T3 算了。

码了 20 分钟过了,第一个样例,但是第二个样例一堆有解的情况输出 \(-1\),开始以为是多测没清空,调了一下发现貌似不是代码问题。

退回去想,显然 \(b\) 序列中间两个必须要相同,既然要相同,在原序列 \(a\) 中肯定间隔 \(n-1\) 个位置,否则两数中间夹的数和外面的数都不相等显然不可能。所以我们只用找 \(a_i = a_{n+i}\) 的位置讨论一下就行。

旁边监考老师开始催时间,打算 T4 写点什么东西,有几分是几分。结果开始打发现完全没有思路,不如回去把 T3 调完,反正是 CSP,翻车就翻车无所谓。

回去手算 \(n = 40\) 的大样例,猛的发现对于 \(a_i = a_{i + 1}\) 的情况也可以作为 \(b\) 串中间的两个数,但是和 \(a_i = a_{i + n}\) 要分开讨论。

但时间不等人,最后还是没调完,只能黯然离场。

出考场听人说枚举第一个数就行,顿时发觉自己sb了,对于中间的数有 \(n\) 种可能,两类情况,但第一个数只能是 \(a_1\)\(a_{2n}\) 两种可能。都是固定两个位置然后贪心,比起来固定中间两位简直太侮辱智商了(

\(100 + 100 + 0 + 0 = 200\)​。NOIP 不能再这么拉了(

posted @ 2021-10-23 20:30  7KByte  阅读(135)  评论(0编辑  收藏  举报