NOIP2021 总结

· · 个人记录

T1

赛时看完题傻了一会,以为要 O(n),然后随手打了个暴力,大样例跑的飞快,就不管了。

T2

T2 没切足以证明我的 dp 水平是多么菜。

考场上先打了 O(m^n) 暴力,之后又想了一个 O(2^mn^2m) 的暴力状压,混了 50 pts。

正解

i 位放 x 个数对答案的贡献是 \frac{v_i^x}{x!}(多重排列),dp 过程中要记录有多少个 1,但有进位不好处理。不过能产生进位的二进制位不超过 5 位(2^5>n),于是在状态里记录五位就行了,具体地,设 f_{i,s,j,k} 表示前 i 位,i+1\sim i+5 位为 s,前 i 位有 j1,目前放了 k 个数。那么有转移

f_{i,s,j,k}\xrightarrow{\times\frac{v_i^x}{x!}}f_{i+1,(s>>1)+x,j+(s\&1),k+x}

最终答案就是 n!\times\sum\limits_{\operatorname{popcount}(s)+j\leq k}f_{m,s,j,n}

总结

  1. 要克服对 998244353 的恐惧,多练 dp、计数题

  2. 对 dp 状态的设计要深入思考,只留最有用的信息

T3

考场我先是注意到这个操作能改变 a 的凹凸性但不能改变单调性,所以为了方差最小,肯定是要先上凸再下凸。

又想了好长时间突然想起了 AGC006C,发现这个就是差分序列的临项交换,差分还要是凸的,于是就会了 O(2^nn) 48 pts。

然后我也注意到 a_i\leq 600 所以差分序列中不同元素个数是 \sqrt{a} 级别,非常小,但也不知道怎么用。盯着这个题发呆了好长时间,依然只会 48 pts。

后来回家有了民间数据,我又写了个枚举差分中每种数,再枚举左右放多少个的搜索,结果民间数据 84 pts \tuu,后来有了官方数据,这个搜索直接 100 pts \tuu\tuu\tuu https://www.luogu.com.cn/record/64015873

正解

还是 dp。

f_{i,s} 表示考虑了前 i 个数,当前 \sum a_i = s,最小的 \sum a_i^2

转移就枚举插在左边还是右边就好了。

总结

  1. 要善于乱搞,退火或者 xjb 搜索往往能拿很高分(指 100 分)

  2. 可以把答案式子的一项放入 dp 的状态,再去计算另一项

T4

暴力就完了,考场上打了 32 pts,实际得分 24 pts,事实证明没有大样例的部分分我永远打不对。

正解

申必数据结构,先咕着。

总结

代码能力还是不够,56 分的部分分都是可以冲的,还不如少看一会 T3 来码 T4 暴力。

总分 222,寄了,连 7 级勾分数线都没到。

我真是太拉了太拉了太拉了太拉了太拉了太拉了太拉了太拉了太拉了太拉了。

不能再颓了啊啊啊啊啊啊,今天开始卷 OI,多卷 dp 题