省流
有史以来打的最差的一场区域赛 VP,\(2t\) 获得铁尾。
9.30
内含剧透,请vp后再来。
不是题解!!!!!!!
赛前
要放国庆假期,简和叶都说要提前走,这场在开始前就充满了不认真对待的气氛,我也在这个气氛里摆烂,感觉这场要凉,当然后来果然凉了。
赛时
仍旧跟榜开局,看 B。B 题是给定 \(n\) 个值,第 \(i\) 个 \(ans\) 是 \(\frac{ans_{i-1}}{2} + a_i\),要求你输出每个 \(ans\) 的正负或零。很好模拟,简单说了一下让简上机模拟,结果挂了。我一看是直接用了 \(double\) 然后按照题意模拟的,这样精度肯定不够,他说要用高精。我说不是,用 \(long long\) 存,每次除以二之后只用关心后面整体剩下的是 \(0\) 或者正数还是负数,而每次二进制下小于零的部分只有最后一个进去的那位有关。然后他又交了两发,分别是没有考虑已经有的小数部分就直接把当前这位赋 \(0\),以及在二进制上的操作混进了十进制的东西,都挂了。我重新说了一遍,他第一时间没完全理解,我说我来写,他拒绝了。其实现在想他做的确实对,如果我又直接码一个未经队友验证的东西签到题吃三发罚时队伍肯定炸了,然后他理解清楚之后自己写过了。此时 \(41min\) 吃三发罚时。
在简码 B 的同时,我和叶神一起继续跟榜看 M。M 题给了三种操作,把一个圆形涂成一个颜色,把一个矩形涂成一个颜色,输出一个矩形中每个位置的颜色,保证输出的位置不超过 \(1e4\),总操作数不超过 \(2000\)。我发现我们并不关心不输出的位置,所以每次只需要把所有要输出的位置判断这次是否涂色就行,总复杂度就是 \(2e7\) 可过。在简还在机上的同时,我把思路告诉叶神之后让他复述给我,我和他确认沟通了一些细节之后简写完 B 下机,叶神上机。我一开始让他用 \(unorderd\_map\) 存 \(pair\) 来存储这些位置,然后我想起来 \(pair\) 不能放进 \(unorderd\_map\) 就给他换成 \(map\),让他先用这个写,并告诉他写完先别交,因为多一个 \(log\) 会超时。他写完之后我把 \(map\) 改成了通过存这个位置在当前查询的序号来存,就可以 \(O(1)\) 执行存取操作。交了两发挂掉,据他是有一些输出反了的操作,我也没有投入进他的代码,但最终在 \(210min\) 以两发罚时通过了,我和简没有在调试上付出精力。
与此同时,我和简的主要精力放在 L 题上。题目给了一个排列,有两个操作,一个是把第一个数放到数组尾部,另一个是把第二个数放到数组尾部,要求在 \(n^2\) 次操作内把排列变成给定的排列。我一开始进行了一些一个一个确定的模拟,发现不太行,去问了简他说他可以,结果给我讲了一会发现是他看错题目了,于是我们重新搞。然后我发现一个一个确定的方法肯定不行,因为确定 \(i\) 和 \(i + 1\) 的位置后,再去把 \(i+1\) 和 \(i + 2\) 的位置确定的过程中 \(i\) 和 \(i + 1\) 的位置就被打乱了。我看到简还在模拟这种,就指出了这个问题,但接下来也没什么交流,队伍还是以打三场个人赛的形式前进。然后我发现实际操作是第一个操作是把指针往右移动一格,第二个操作是把左右两个交换,所以每次操作的模拟其实可以 \(O(1)\) 搞定,也就是不用担心时间复杂度。然后我发现一开始的想法虽然不能相连着搞,但是可以两两配对,最后再改这些配对的顺序,每个配对都是 \(n\) 次,最后调整我没太清楚,但我觉得前面那个挺好的,所以应该没问题。在奇数个位置时因为剩一个没有配对可以用来当轴,去调整配对的顺序。然而偶数个位置就不行了,因为没有轴。所以考虑偶数位置时剩下一对先不配对,用其中一个当轴,把顺序转好后最后这两个就很容易配对了。我把整体思路告诉简得到肯定,他就上机去码,不过最后他 TLE 挂了,我也不知道具体发生了什么。
简去上机之后我去开了 J 题,J 题是一道博弈论,两个人轮流给定的森林中的一条边或者一个点,删掉最后一个点的人失败,问第一个人有多少种必胜的删法。我感觉和点数以及边数的奇偶性相关,但没有什么建树,就这样中途结束了比赛,他们回家,我默默挂机。
赛后
赛后没什么可说的,欲辩已忘言吧。
然后补题,我先补了 G 题。G题给了一个网格,在网格中有一些竖着的墙壁,墙壁数量 \(2e5\),问是不是所有没有墙壁的空地之间都恰有一条简单路径,保证空地之间都互相有路径。这个题其实非常容易想,其实就是如果出现四个空地组成的正方形就挂了,然后把每一列相连的空地都看作一个点,然后有相邻的空地就连边,最后判环就行。当墙壁数量远少于列数时,一定会出现相邻的两行空地,所以直接挂。那么点和边的数量就被限制在 \(2e5\) 这个数量级,就很容易搞定了。再注意一下边界条件等于 \(1\) 的特判就很容易轰过去。看这个题最主要的感想是实战中相同牌子的题目也许还是要挑擅长的去做,应该会更有优势。
然后做 J 题,发现赛时其实已经很接近了。就是把操作转换成指针后,发现就是冒泡排序的操作。然后把目标序列映射一下,就可以变成一个从小到大排序,接下来按照冒泡操作模拟即可。这个题目最大的问题是没把目标序列重定义成 \(1,2,3\) 这样,很多这种变化的题目都可以用这种方式做。
最后补 D 题,题目给定一个区间,要求把这些区间中的所有数字视为点然后搞一个最小生成树,两个数字间的边为这两点的 \(lcm\) 的不同质因子数,范围 \(1e6\)。容易看出想要边比较小就是去找两个点合起来不同的质因子最小就行。然后发现一个点往外连只有两种情况,一是直接随便连一个质数,消耗就是我这个点的质因子数加一。二是连一个被这个点的集合完全包括的一个点,消耗就是我这个点的质因子数,想要尽可能连就是连前后离我最近的那个满足这个条件的点。考虑预处理出满足条件的点,因为最多有七个质因子,所以可以暴力枚举这个的子集,利用质因子之积表示就可以。利用埃氏筛就可以预处理出每个点的质因子了。最后把这些可能用到的边跑一个 \(Kruskal\) 就可以。注意加一个 \(log\) 可能会被卡常,同样因为最大的边权就是质因子数加一,所以可以用八个桶去存边,从最小的桶去挨个查也可以实现从小到大取,且复杂度就是 \(O(n)\) 了。如果区间内没有质数可以连,区间的范围一定很小,跑个暴力就可以了。
2025年10月7日