NOIP2021 游记
Day -21 ~ -1
停课了,好开心o( ̄▽ ̄)ブ
中间没有什么好说的,无聊的集训。
Day 0
跟同学颓废了几乎一天,意外地发现备考室电脑有 PVZ2,玩了一会。
下载了 MC 玩玩,然后专注于物理画线(
希望不要炸。
Day 1
吃过早餐就到考场了,密码忘了。
先看 T1,发现最大的数 \(10^7\) 的后一位也才 \(10^7+1\),所以想到了一个暴力的做法:把所有不符合条件的数筛出来,然后预处理下一个数是多少。
测了一下极限数据,感觉可以过,就没管了。
T2 没有任何思路,是我不会做的题,于是打了 50 分暴力滚了。
T3 更不会了,连差分的关键性质都没观察到,打了 12 分就滚了。
T4 感觉很可做,有大量部分分,于是开始莽。码了个类似 bfs 的东西,期望 44 分,但是第三个大样例没过,不会打暴力的我只能眼调。
后来的三个小时,我就一直对 T4 眼调,试小样例,重构了 3 次,到最后都没能调出来……
没什么好说的,这种垃圾游记还好意思写出来。
Day ???
果不其然,T4 炸了,100+50+12+0=162。
在同学们一个晚上的帮助下,发现了 T4 爆零的问题:数组没有初始化。
啊啊啊啊啊什么出题人会出这种 \(n\times m\) 的题目啊。
不过我还是不知道为什么大样例没过。
压线一等。ZLT 194,ZTC 187,WCJ 168,都是大佬。
膜拜学长 LH 344 全省第一!!!
退役了。
Bonus
既然打的太烂了,我来补充一下中间两题的解法吧。
T2 在考试当天晚上就想出来了,也许我应该肝 T2。
考虑到 \(n\) 不大,就算 \(a_1=\cdots=a_n=m\),也只会对前 5 位产生影响。
按 \(0 \sim m\) 的顺序决定要选多少个进到 \(a\)。设 \(f_{i,j,k,l}\) 表示现在 \(a\) 里面有 \(i\) 个数,已经选完了 \(0 \sim j\) 的数,对二进制 \(j\) 位后 \(5\) 位的影响为 \(k\),目前 \(1\) 的个数为 \(l\) 的答案。
直接枚举转移即可,复杂度 \(O(n^3m2^5)\)。
T3 令 \(d\) 为 \(a\) 的差分数组,一次操作就相当于交换相邻两个 \(d_i\)。所以题目要求重排 \(d\),使得方差最小。
化简一下方差的式子,得到 \(S^2=n\displaystyle\sum_{i=1}^{n}{a_i^2}-(\sum_{i=1}^{n}{a_i})^2\)。
通过打表发现,最终答案的 \(d\) 数组一定先递减后递增(证明有点麻烦),所以将 \(d\) 数组从小到大排序,每次可以将 \(d_i\) 往两边放,暴力做的时间复杂度为 \(O(2^n)\)。
用 \(dp\) 优化求解过程,可以记录 \(\displaystyle\sum_{i=1}^{n}{a_i^2}\) 或 \(\displaystyle\sum_{i=1}^{n}{a_i}\) 来最小/大化另一个式子。因为 \(\displaystyle\sum_{i=1}^{n}{a_i}\) 会小一点,记录的空间会更小,所以选择这个。
设 \(f_{i,j}\) 表示考虑到 \(d_i\),目前 \(\displaystyle\sum_{i=1}^{n}{a_i}=j\),\(\displaystyle\sum_{i=1}^{n}{a_i^2}\) 的最小值,转移方程推一推就出来了,时间复杂度 \(O(n^2\max{a_i})\),无法通过最后一个 sub。
发现题目中的 \(a_i\) 很小并且递增,所以有很多 \(d_i\) 的值为 \(0\)。事实上,\(d_i=0\) 时的转移是无用的,所以可以直接忽略,复杂度变为 \(O(na_i\min(n,a_i))\),可以通过。
范围很奇怪,建议用滚动数组。一些奇怪的随机化做法也可以过。