2025 暑假多校(更新中)
代码见 3/6(牛客),NUAA01(杭电) 或 洛谷剪贴板
今年多校是和 atom(AtomFirst) 和 hlgg(hubbya) 一起打的。
牛客多校 Day 1
火速开签到,atom 发现 G 只要暴力求出匹配再统计一遍答案就行了,上来就切了。
然后和 hlgg 看 E,手玩发现平方数的差可以生成以 \(3\) 开头的奇数数列和以 \(8\) 开头的 \(4\) 的倍数数列,并且平方差要么为奇数,要么模 \(4\) 为 \(0\),所以就做完了。我上机写完交了一发 WA 了,马上发现爆 int,改了就过了。
继续和 hlgg 看 L,发现中位数总是不降的,所以可以直接维护中位数!跟 hlgg 讲了这个思路就让 hlgg 上机写了。
接下来和 atom 一起看 K,发现如果把每个门作为状态的话就是一个基环树森林,可以找到环转移。但是因为走廊可以重复走,并不是很会计数走廊个数。后来 atom 思考了一下发现根本没有基环树!全是环!我随即上机写写写就过了。
这中间 hlgg 写了一半的 L 发现不是很好写,所以我上机重新写了一遍 L。交上去发现 T 了,非常神奇,原来没删 std::cerr,再交发现 WA 了。旋即发现用 %d 输出的 long long,我突然释怀地笑,然后交上去又 WA 了,后来发现不是这个问题,因为答案本来就不会爆 int,但是有一处 int 没改成 long long,改了交上去还是 WA /kel。hlgg 想了一会发现我维护 mid 时处理小于 mid 的数的更新逻辑有一点问题,我思考了发现很有道理,改了终于过了!这题确实不是很好写!
大家一起看 H,操作 1 可以用差分数组 \(O(1)\) 维护,然后操作 2 可以用 G 的做法 \(O(n)\) 暴力查询,这样总复杂度是 \(O(q_1 + n q_2)\)。开了 4s 我比较有自信能跑 \(nq_2 = 2.5 \times 10^9\)。但是这个做法太暴力了,而且这道题 dirty 率非常高,所以肯定不是正解,尝试让 atom 写了一下发现果然 T 了。大力卡了一下常还是 T,所以就放弃去看 I 了(赛时确实放了个别暴力过去了,赛后这题的时限改成了 2s,感觉这道题出得没那么好)(lxl:数据结构的本质是卡常)
I,先和 atom 胡了一下 \(O(n^4)\) 的区间 dp,状态数只有 \(O(n^3)\),但是转移需要 \(O(n)\),所以接下来就是怎么考虑优化转移。我和 hlgg 一直认为要求的 \(\min \times \log\) 一定有某种意味,于是猜了个每次转移只要考虑不平衡度最大的合法区间的结论。结果 atom 这时自己想出来了可以维护最优转移的方法,直接上机开写。接下来全程端茶送水,并不是很懂 atom 的做法,封榜后一直在摸鱼,而 hlgg 帮 atom 调了很多。I 先是 WA 然后 T,我建议把 std::map 换了,atom 改了发现没改对,在最后的紧要关头,发现 upper_bound 写错了,最后 3min 提交过了,没 WA 也没 T。那我只能拜谢 /bx。看了题解后大家锐评 \(\min \times \log\) 的意义就是让你 TLE 的。
第一场感觉打得不错,n+1 了残阵的 loveless。
H 暴力是 \(O(q_1 + nq_2)\) 的,因为是 01 串,考虑手写 bitset 分块处理,设块长为 \(B=16\),对于操作 1 仍然维护差分数组,在边界 \(O(B)\) 暴力翻转,对于操作 2 只要处理 \(O(\frac{n}{B})\) 个块(可用 unsigned short 提取),接下来考虑 \(O(1)\) 合并两个块需要维护哪些信息。首先是块内贡献,然后只要知道前缀零和后缀零个数即可合并,因为块的状态数只有 \(O(2^B)\) 种,可以 \(O(B2^B)\) 预处理。
I 设状态为 \((l,r,m)\) 表示区间 \([l,r]\) 在 \(m\) 进行分隔,可以算出不平衡度,处理 \([l,m]\) 和 \([m+1,r]\) 各自关于不平衡度的前缀对应的代价最小值就可以二分 \(O(\log n)\) 转移最小代价。 要做到 \(O(1)\) 转移,需要注意不平衡度在中心点向两边是递增的,所以可以直接求前缀最小代价,并且将区间向左右拓展的时候类似地也从对应的中心点进行转移。具体地,可以用两个辅助数组分别维护在区间 \([l,r]\) 从左区间 \([l,m]\) 和右区间 \([m+1,r]\) 的最优转移。开 \(n^3\) 的long long 数组发现空间直接爆炸了!但是因为 \(l,m,r\) 有顺序所以数组只用开 \(\binom n 3\) 约为 \(\frac{n^3}{6}\) 大小。
牛客多校 Day 2
开场看 F,感觉比较签已经会了,可能是维护一下前缀、后缀进行 dp,但是不是很好写。想着想着 atom 就把 I 切了。
跟着 hlgg 开 B,转换题意为位完美当且仅当 \(a_i\oplus a_j \geq \max(a_i,a_j)\) 恒成立,那么必然要求最高位各不相同,所以 \(n>64\) 就必然输出 NO?想了一下确实是对的,写了个 \(O(n^2)\) 暴力就过了。
然后和 hlgg 看 L。hlgg 将问题转为在一些偶环和奇环上删两个点最后全是偶数块的方案数,那么显然只要讨论一下。删偶环的情况 hlgg 推了一下是 \(\frac{\rm len^2}{4}\) 就上机写了。hlgg 写了一会想了一下发现不对,不是环而是基环树,然后我重新看了眼题面想了一下不对,不是基环树是环,然后 hlgg 就继续愉快写完了,但是一交发现 WA 了。
这时 atom 已经写了一部分 A 了,跟着思考了一下维护两个 dp 数组可以做,然后 atom 写完 A 了。
一起瞪了一会儿 L,hlgg 敏锐地发现长度大于 \(2\) 的偶环有两种情况(而小粉兔花了很长时间才意识到这一点),改了下就过了。
终于可以上机写 F,hlgg 和 atom 去开几何题 G。写完测了下样例发现做法假了,但是想了想可以把连续 0 构成的段提取出来,根据长度直接计算对答案的贡献,写完过了。
G atom 已经会了,只要维护最远端点的最大夹角,上机开写。我和 hlgg 想 H,hlgg 得出一个结论,升级全用在一条边上是不劣的。于是我发现对于每条边 \((u,v)\),如果选择它进行升级,那么答案就是 \(1 \to u\) 的最短路加上升级后的边权加上 \(v \to n\) 的最短路,是一个关于升级次数 \(k\) 的一次函数,可以求凸包来斜率优化 dp。和 \(\rm Loxilante\) 进行的 Duel Vol. 02 就有斜率优化的板子题,但是还没补,幸亏 hlgg 的书上有例题。
计算几何 G atom 很快就写完了但是 WA,也没有什么精度问题。大家对着代码瞪了很长一段时间没发现问题。突然 atom 发现如果旋转中心不在凸多边形内,那么还要考虑最近点。但是加上去了这个运算逻辑还是 WA,并且根据评测时间似乎是挂了同一个点上,很晕。atom 思考了一下,发现最近点不一定是凸多边形的端点,而可能是在直线上,而且最近点只有一个。这是对的,证明只要考虑圆与凸多边形相切长什么样子。所以只要旋转中心不在凸多边形内,答案就是 \(2\pi\),改完终于过了。
时间来到 3 小时,hlgg 参考着书上代码写 H,我在旁边看。冷静想了一下只有一个单调栈,慢慢想清楚细节还是容易写的,作比较还需要用到 __int128。hlgg 写完就过了样例,很牛啊。交完发现输出超限,绷不住了。马上查出了我以前犯过的错误,那就是用 int 读入 long long 范围的数会错位,这题的边权范围居然是 \(\leq 10^{12}\),真无敌了。改了交是 WA,发现存边权的地方还是用的 int 没改,改完过了。
时间还剩一个半小时,一起想 E。hlgg 打了下表发现每个数加上它的质因数最多只能得到一个平方数,也就是说一个平方数对答案的贡献就是它的质因数个数,所以只要会求 对 \([1,10^9]\) 的 \(x\),\(x\) 的质因数个数求和 就行了。这个可以根号分治,问题在于怎么快速算出区间的质数个数,结果 hlgg 居然有板子!/bx 而且板子跑得飞快,这题居然能写了,最后还需要暴力算一下右端点的边界情况。hlgg 写完之后还写了个暴力拍了一下。拍了但是是手动拍的,交上去发现 WA 了。我发现 hlgg 求平方根用的 sqrt,这在 long long 范围会有精度问题,应该用 sqrtl 才对。hlgg 直接写了个 getsqrt 函数但是交上去还是 WA。这时候才开始真正对拍,拍出来错了。马上发现算边界的暴力写错了,改完 A 了。%%%%%%
这场感觉打得非常牛!罚时战胜了单挑的小粉兔并且 n+2 了 loveless!(loveless 怎么不会 H)
D 枚举最终的背包大小 \(U\),这样就能合并每袋薯片的快乐值和易碎度为一个贡献,直接 0/1 背包是 \(O(nU)\) 的,不可接受。考虑 \(U\) 很小,对于所有空间为 \(s\) 的薯片,只有贡献大小在前 \(\lfloor\frac{U}{s}\rfloor\) 的才可能参与转移,总共参与转移的薯片数量只有 \(\sum\limits_{s=1}^U \lfloor\frac{U}{s}\rfloor = O(U \log U)\),所以只用转移 \(O(U^2\log U)\) 次,而对于每个空间 \(s\),可以用 std::nth_element 线性求出前 \(\lfloor\frac{U}{s}\rfloor\) 个薯片,合起来是 \(O(n)\) 的。

全真模拟 JS NOIp
浙公网安备 33010602011771号