代码源CSP-S模拟赛Day7-9赛后总结
Day7
赛时
先扫一遍题,T1 显然数位 dp,感觉放在T1应该不难,而且题面有一种很亲切的感觉,感觉很可做。T2 简单思考一下发现最终合成的数就是 \(a_1\),\(a_2\),\(a_3\)……,\(a_n\) 这 n 个数填正负号再加上一个 k 的倍数,估计会有一些比较智慧的手法,感觉很有趣。T3就是简单思考了一下自环和重边的处理,然后就去看 T4了。T4 领域查询好像之前jsy模拟赛里出了一道题,题目很像,那道题好像用了树剖。这道题貌似是进阶,但前几档大众分有线段树,以及还有一档或两档不是那么大众分的好像能预处理然后在线搞,给我一种跃跃欲试的感觉,于是计划给这道题留的时间比较多。
T1 一眼数位dp,首先 n 个数或起来的值等于和显然各个位置上有且只有一个数是 1。于是就先码了一个 55 分的 dp,\(f_{i,mask}\) 表示前 i 个数或为 j 的方案数。正解不怎么会了,原因是忘了数位 dp 的状态设置是什么了,我好像记得没有开过数位 dp 的专题。
T2 想到给这些数添加正负号之后 15分暴力分就直接出来了。但我没有想到怎么确定最后的正负号到底怎样才最优。感觉合法的方案数肯定不唯一,想到了 \(n^3\) 的dp可以处理出来所有合法方案,但数据范围没有给这一档部分分,感觉可以再想想不想耽误太多时间决定不码暴力直接跳,等会回过来再想,于是就先跳了。
T3简单想一下,发现只会暴力,但看时间发现已经十点多了,我还计划着给T4多留时间呢,暴力都没码就撤了。
T4码dfs序和线段树的时候由于函数与Sub1的函数重名,害我de了十几分钟。然后想了一下不大众的挡,之前感觉能拿40 ,发现有一个超了,但也还多了十分。\(O(10n)\) 的预处理,迅速开码,然后是痛苦的debug,大概在11点20多的时候交上去发现 TLE ,我本地测了一下,答案是对的,但跑了8s,想了一下,菊花图可以把它卡掉,GG。此时距离比赛结束不到40分钟。
T2,T3暴力都没码,我速速的30分钟码了2道题的暴力,此时11:57。沾沾自喜,以为稳了,这时我迅速提交T2,发现edge炸了……慌乱之下问了雪月花果断切谷歌,结果提交T2的时候由于太急多点了几下,直接给我提示15s后再提交,此时北京时间11:59分,省去中间焦急的等待过程,最后一分钟极限交上两道题,并且成功选择了C语言(由于之前没有用谷歌登过代码源),于是两题爆蛋。
最后40分钟心态爆炸了,犯了许多很糖的错误,如果我稳一点,至少BC的暴力分能拿。以及以后不要再像当时一样T2T3暴力都不码,直接去做数据结构了。
赛后
T1 大概是一个很典的数位dp,如果你状态设置对的话,A 掉还是比较容易的,并且正解的状态也是很经典的状态设置,\(f_{i,mask}\) 表示从高到底前 i 个 1 分配,mask 表示哪些位置被“卡满”了的方案数。转移是显然的。我们只需枚举每个数,如果它被卡满了,且 \(r_i\) 的这一位是 0 ,那么 1 就不能给这一位,否则就可以给,正常的转移即可。
T2 想到 \(n^3\) 可以处理所有方案了,但没有想到竟然还有神秘规律,打表!!!!
T3 是在生成树上大胆贪心,基本懂了,T4 是跑 bfs 序,存下每个点第 i 层的区间解决邻域的修改查询,子树修改查询怎么处理呢?感觉不是很会啊。
T1 T2 已订,T3 T4 待订。
Day8
赛时
T1 读完题后忘记了数据范围,以为 n 是一个 2e5 级别的,于是以为这是什么神秘贪心,神秘性质题,在草稿纸上手玩了30分钟式子,有了一个初步的dp想法,但是复杂度很高,于是码了个暴力就撤退了。
T2 首先随便搞了一个较复杂的 n^3 做法,枚举 i,枚举 k,再枚举 \(a_j\) ,预处理各个颜色的前缀和,把i到k之间的\(a_j\)个数乘上\(k\)后面的个数即可。简单调了个十分钟,随后考虑下一个 \(n^2\) 的档。我们在纸上画画图发现可以直接枚举 k 和 \(a_j\) ,然后预处理k前与k颜色相同的位置中间的k的个数以及有多少个i覆盖到它,做一个类似带权前缀和的东西,再做一个定义类似的后缀和。预处理是 \(n^2\) 的,统计答案也是 \(n^2\) 的。但是这个思路很使,细节很多,对着那么多式子硬调到9:30,就交了个 \(n^3\) 上去,撤退了。
T3 一看数据范围,以为是什么神奇且逆天的贪心,再加之这时 whrdalao以及 xueyuehuadalao貌似(好像)都过了 T1,于是迅速跳了 T4 ,码了个暴力,回头看T1了。
觉得T1 没准诈骗,回头看了眼,好家伙,n<=100……,于是开始考虑了一下 dp 的细节。首先这个dp我们得从后往前d,原因是你从前往后d是有后效性 的,你不知道你后面到底打多少次,无法统计贡献,所以 初步设置状态是 $f_{i,j}表示考虑从 n 到 i ,你总共加了 j 的伤害的最大总伤害。发现对于 2 操作是无法转移的。纸上手玩一下发现这玩意儿转移还需要一个攻击回合下标和,于是状态就是这三个东西,差不多是 1e8 级别的,转移显然。A的时候差不多比赛也接近了尾声。最后20分钟都在调T2 ,不出意外 \(n^2\) 没有调出来,不过值得庆幸的是第一遍码的时候没有注意到取模,第二遍加上了,有惊无险没有挂分。
赛后
T2 首先题解 \(n^2\)的做法简洁明了。直接枚举 j 和 k ,然后前缀和统计一下前面的 \(a_k\) 数和后面的 $a_j $ 数,乘起来。正解好像是个根号分治 ,出现次数大于 B 的……完了完了,忘了。
T3 竟然就分讨+模拟,赛时尊嘟被吓到了。
T4 不是很懂,而且讲得时候还有什么and卷积什么的,畏惧了。
T1 T3 已A,T2 T4待订。
Day9
赛时
T1首先想到了最终的糖果数一定是一个定值,为所有糖果 &
起来的值。然后直接就用这个东西码了个你\(n^3\) 区间dp,发现同机房dalao们基本都过了,很慌,并且此时时间已经是开赛快一个小时了,所以就跳T2了。
T2好像做过原,也忘了什么时候的事了,由于1个小时还没有 AT1,心态有点炸,当时不敢细想T2 ,知道T2 码量大,直接考虑暴力了,但是考虑我想了个暴力写完调完发现T了,仔细思考后发现我对于多个乘法用了乘法分配率,将n个数分别与3相乘再乘一块变成了n个数乘一块然后乘3……,暴力码炸了心态更崩了。
当时想稳住心态,决定无论怎样T1 必须A,不然后面的题肯定做不好。果断回去。仔细思考了一下,我们可以把原序列分成若干段,这几个段满足段内异或和为整个序列的异或和,发现最优的情况下就是每个段的长度减一再相加。接下来是怎么划分的问题,不妨假设只要当前异或和正确了,就开新的一段,这样做一定是优的,因为你考虑我把后面的那个数划给这一段的话除非后面的所有数都构不成一个正确的异或和,否则的话我这个数往哪个段上合并均可。如果后面的数都合不成正确的异或和的话他们所有的数肯定都要往这个段合并,我们直接特判掉就行了。于是做完了。
T3 一开始理解错题意了,我还疑惑你直接给 n 不就行了,给我序列干啥。大力推到了一波式子,用组合数公式胡搞了几分钟,发现可以 O(n)求,我心想,就这么简单???于是果断开码,然后直接过样例了,交上去后面的都Wa 了。感觉式子很对,但不知道为啥,打表输出了发现程序完美的执行了我的思路,此时剩30分钟,T3T4暴力没码,于是跳 T4 码了暴力回来,在最后15分钟的时候读懂题意了,速速码了个若只暴力,然后又想了个25分的,速速码了一下,成功在比赛结束后第 0.0001s 完成。
这场打炸了,签到做太久,而且T3理解错题意了,直接把dp题整成数学题了,前面太急了,后面太糖了
赛后
T2 是贪心,\(\frac{n^3}{w}\)判掉无解。接下来考虑最坏情况每行每列都操作,由于保证有解,我每行找到最多有多少列是互相相等的这些列我横着涂,其他的我竖着涂。再在列上也搞一遍就行了。
T3 是简单dp,没啥好说的,都怪我太糖了。
T4 是图论好题,离线的部分听懂了,在线的k=1听懂了,k>1的倍增没搞清楚,待订,T1T2T3都订了。
感觉这场的问题就是心态和时间分配,其实T3比T1简单,但我没时间做了。