10.15模拟赛

T1:P15892 [COCI 2025/2026 #6] 教室 / Učionica

期望得分:100

实际得分:100

水青题,有一个转化感觉很好,这个其实就是 \(a\) 和 \(b\) 两个数组匹配要求 \(a\) 的每个都大于 \(b\),我们把 \(a - 1\) 转化成大于等于。

然后对于值域做前缀和,要求 \(suma_i <= sumb_i\),线段树维护两者相减即可。

T2:P17170 未来

期望得分:50

实际得分:0(50)

括号里的是洛谷得分,我挂成 \(0\) 不是因为数据强而是因为写出来__lg(0)这种东西UB了。

在本地和洛谷测不出问题但是在lemon上就是过不了,警示后人。

首先判无解,就是尝试构造,钦定第一行为 \(0\),和暴力一样写法求出实际的 \(sr,sc\),然后验证。

但是验证成功必要但不充分,我们刚刚忽略了限制,所以尝试调整出合法解。

算每一位是否必须取反 / 是否不能取反,如果左右脑互搏又必须又不能就无解,然后要取反就取一下,构造出合法方案。

然后发现性质,在这些限制中,\(log_2r_i/c_i\) 的最小值为 \(k\)(我们暂且令 \(0 := 0.5\))那么所有大于 \(k\) 的位都不敢动,动了不能保证解的合法。

相应地,小于 \(k\) 的位置随便动都可以合法,顶多是多花操作次数。

先比较大于 \(k\) 的位,能比较出大小关系贡献就定了,比较不出大小关系才有低位的事。

怎么求出低位最优解呢?上01Trie。

首先转化先设基础贡献为 \(1\),加上等于 \(2\) 的个数即可,这样更简单。

对 \(r\) 考虑因为 \(r\) 和 \(c\) 等价。考虑 \(r_i \oplus sr_i\),如果为 \(0\),两者一样,如果为 \(1\),两者不一样。

分讨:一样的情况,\(r_i = 0\),啥事没有,如果异或 \(0\) 那么继续相同向下递归,异或 \(1\) 就赢了。

\(r_i = 1\),发现异或 \(1\) 会出现额外贡献,所以这个时候在 \(0\) 的那个叉加上 \(1\),表示你去 \(1\) 那边就要承担这个花费。

不一样的情况,\(r_i = 0\),啥事没有,异或 \(0\) 直接赢,异或 \(1\)还得往下看。

\(r_i = 1\),异或 \(0\) 有额外贡献,所以在 \(1\) 的那个叉 \(+1\)。

归纳,发现如果 \(r_i = 1\) 那么在 \(r_i \oplus sr_i\) 的那个叉 \(+1\)。

发现如果 \(k\) 往 \(r_i \oplus sr_i\) 那个叉走,就要继续递归看,所以我们insert的时候也如此做模拟上面过程。

这就能求了,但是还有一个细节,就是 \(0\) 怎么办,这个把单点插入到叶子的时候每个点减去 \(1\) 即可。

考虑为什么一定减去 \(1\),因为 \(0 \le r_i\) 恒成立。

做完了。

T3:P17596 「CZOI-R8」蝎虎天体 -Lacertid-

期望得分:10

实际得分:10

whs说40pts白给?可是我不会啊,T2的50明显更傻吧。

然后我的40分调了一晚上,就是去凑 \(k\),当前大于 \(k\) 直接赢了,如果当前小于 \(k\) ,找到当前最高的不同位置,然后用最小代价调整,不断贪心。

考虑优化这个暴力,我们要凑出这一位,怎么做?要么进位,要么直接有。

进位进过来需要什么?设当前 \(t\) 的低位为 \(s\),\(a_i\) 的低位为 \(c_i\),\(B = 2^p\),那么存在 \(s + c_i >= B\),并且这一位本身是 \(0\)。

如果不存在呢?那就找最接近的进位得到,维护 \(mx_{p,0}\),表示这一位是 \(0\) 的最大的低位,\(mx_{p,1}\) 同理。

要求的其实是什么?\(t\) 和 \(a_i\) 这一位相同,设 \(t\) 的这一位是 \(now\)。

直接求 \(B - s - mx_{p,now}\)。

不进位的形式类似,存在\(s + c_i < B\),这一位本身是 \(1\),即两个数不同。

和维护 \(mx\) 一样维护 \(mn\),条件等价于 \(s + mn_{p,now \oplus 1} < B\)。

如果不行的话,就得凑到 \(2B\),是 \(2B - s - mn_{p,now \oplus 1}\)。

一位一位维护做完了。

T4:P16998 【MX-S15-T4】「DLESS-5」Waking Shadows

期望得分:15

实际得分:15

南非了。

首先发现 \(nqlogn\) 的暴力简单,考虑怎么进一步优化到 \(nq\),考虑RMQ:MEX那道题。

扫描线,设 \(lst_i\) 为最后一个MEX能得到这个的位置。

怎么维护呢?发现每次新加进来一个值,不考虑 \([l,r]\) 的限制就是数组前面添上一个 \(r\) 然后整体右移。

考虑这个限制,那就不移动这段,别的照样即可。

所以现在会 \(n^2 + qlogn\),log来自二分但是不重要,因为瓶颈在 \(n^2\)。

发现 \(qlogn\) 太宽松了考虑换根号级算法平衡复杂度,值域分块维护lst,为什么这么做呢?

因为右移的操作使得整块好做,其实就是取出块中最小值,如果最小值小于当前插入的 \(x\),那么弹出最小值插入 \(x\)。

最小值上堆就行了,这样会有 \(n \sqrt n logn\) 但是 \(n\) 比较小可以过,散块怎么做呢?

考虑分块的宗旨就是暴力,直接跑上面的暴力,这就赢了,做完了,查询就是一块一块看。

最终复杂度 \(O(n \sqrt n logn + q \sqrt n)\)。

但是,维护这个还是比较费劲的,你无法确定 \(x\) 插入到哪里,不能保证块内有序。

所以上tag,这个tag也是一个堆,每次pushdown就是把堆里取出来和当前值比较,得到新的数组。

注意就是取出来的数可能会替代后面的,为了不带上log,我们开桶,考虑值域多大?就是tag大小+块长。

这个复杂度没问题,取出来记一个 \(cnt\),单次操作都是 \(O(1)\) 量级的。

然后就是要把数组排序,为什么呢?因为要开桶,你不能现排序带log了,那提前排就行了吗?

行,因为你不是有桶吗,直接用这个桶进行桶排,这次的把下次的排好,下次的把下下次的排好。

然后更新这个块的小根堆,这个直接把值抽出来建就可以了,这时候就有问题了一个一个插入不是带log吗?

一块插入log就没了!你可以理解为线段树build。

所以实现也会了恭喜通过黑题。

总结

T2那种情况就背下来吧,赛时我应该留时间检查所有系统函数的定义域。

加上T2的50pts获得175,一等奖。

T3的40pts可以会一下,但是有点难,如果会了直接总分205进队了。

205之上基本没啥唐分了,我是认为T4多拿17比T2正解简单,T4的暴力也就上位青/下位蓝难度。

posted @ 2026-10-17 09:49  wzc6666  阅读(9)  评论(0)    收藏  举报