代码源Csp-S模拟赛Day10-11赛后总结
Day 10
赛时
T1 赛时感觉很难维护时间以及多个精灵同时到达同一格子的情况,后来想了一种做法:对于每个格子最早被遍历到的时间我们的处理是容易的,你考虑我们可以对每行每列都建一棵线段树(数据范围保证了 \(rc\leq5e5\),所以总空间大致是一个 \(4rc\) 的,动态开点处理的话,空间肯定不会炸),如果一个精灵能向右走,我们就在它这一行的第一个线段树的他这列的那个位置上添加一个 \(t_i-y\) ,\(t_i\) 是该精灵出现时间,y 是他所在的列数,其它方向的同理。然后你求每个格子最早的染色时间的时候先 \(n^2\) 枚举所有格子,分别查询它四个方向的精灵,线段树维护,所以是 \(\log\) 级别的,于是 \(n^2\log\) 可以解决这个问题。然后你得到每个格子最早被到达的时间后你按照精灵的编号去枚举,维护一个指针指向它当前能染色到的格子编号,然后每轮按照他的方向继续移动一格,判一下到达时间不等于这个格子的最早遍历时间那么这个精灵就死了,再继续考虑下一个就可以。每个格子至多遍历一次,所以复杂度 \(O(n^2)\) 。这一系列都很对,但有一个小问题,就是你在预处理每个格子到达的最短时间的时候没有考虑到有的精灵一出生就死了,根本不可能遍历到它,但是你还是统计到了他的贡献,导致有一部分点你本身是可达的,只因最短时间的统计错误致使不可达。赛时是已经码完之后不过样例仔细思考才意识到这点的,而且这个思路实现需要很多细节,包括我线段树还码炸调了半天……意识到思路假的时候已经11点了(我本身是考虑T1A掉,后面都打暴力分数还是可以的,所以在这到题上投入了差不多四分之三的时间)。后面都打的暴力,所以也没啥可说的了。
赛后
T1 糖完了,竟是之间把每个精灵放到优队里暴力模拟……我感觉这个手法也见了不止一次两次了,不过是一年前的事了。已订。
T2是道构造题,容易发现一个性质就是如果我们找到了一个合法序列a,可以合理调整每个元素的值(+k,-k)来得到更多的合法解。所以一种想法是我们求一下序列a的和模n为i时和的最小值,通过枚举 \(a_n\) 的值为多少已经在这种情况下我们考虑原序列前 j 个元素,我们可以dp 求解这个问题。已订。
T3简述的话是只要你会码dfs暴搜后你就很容易想到 \(n^3\) 的dp,然后发现第三维没用优化成 \(n^2\) 的了。如果你还能注意到dp 下标的单调性,就完全转化成了格路计数问题。这就是正解了(感觉上一篇写得太长了所以决定简化题解部分)。可订未订。
T4……未订
Day 11
赛时
时间分配大致是 T1五分之三 T4 五分之一,T2T3五分之一。
T1是在磕正解,T4是20分的dp码炸了在努力的对拍,T2T3是简单的码暴力+T2推一些小性质。
但是T1糖了,没磕出来,所以是全场暴力,每道题的思考过程也没啥好说的了。
赛后
T1 看题面感觉很亲切,因为类似的题我做了两道,都是让你建的图有 \(n^2\) 规模的边让你求最小生成树的总边权的。一道是今年打的应该是abc35x的一道F题,另外一道是P9488 ZHY的生成树,它们的思路都是考虑一些不必要的建边然后暴力跑Kruscal。其实都说到这儿了这道题的解法也呼之欲出了。你考虑建的新图正常建是 \(m^2\) 个点,但你考虑建图的过程,枚举每个点它所连的每条边互相连边,那么你考虑只需要让边权最小的那条跟其它的连就行了,其它的连边都是无意义的,于是总边数为 \(O(m)\) 级别的。然后就做完了。
T2 T3 T4 都待订吧,视频还没看完,T1订过了。
总结
1.我觉得还是先把暴力都码完再磕正解比较稳妥一些,不然我这两天的比赛暴力分都没拿多少,都是仓仓促促最后三四十分钟码的。
2.思考的时候有的时候不够缜密,这种码了一两个小时最后发现思路是错的情况发生并不少见。
标签:11,暴力,格子,精灵,T1,Day10,Csp,赛后 From: https://www.cnblogs.com/yxans/p/18450569