NOI2025四川省集授课补题
NOI2025四川省集授课补题
题单: NOI2025四川省集授课题单 - 题单 - 洛谷 | 计算机科学教育新生态
两道很好的撒谎交互/通信题。解决非传统题应该从题目本身入手
两道很好的KTT板子
KTT和吉司机一样是加个tag就对的势能线段树,tag为加多少需要改变最大子段的选择,复杂度 \(\mathcal O(n\log^3 n)\)。
完全图MST问题,有两种做法。
算法一
考虑一个结论
设边集 \(E\) 的MST为 \(T(E)\),有 \(T(\bigcup\limits_iT(E_i))=T(\bigcup\limits_iE_i)\)
原问题不好直接处理是因为 lca 不确定,于是考虑点分治。设中心为 \(G\),考虑树上所有穿过 \(G\) 的路径,对应在完全图的边集产生的边。他们两两的边权为 \(a_x+dep_x+a_y+dep_y\),很明显只需要找到 \(\min\{a_x+dep_x\}\) ,然后从 \(x\) 向其他点连边,就可以找到MST。这些边数之和为 \(n\log n\),最后再求一次 kruskal即可。即使在同一子树也无妨,因为贡献更劣,没有影响。复杂度 \(T:\mathcal O(n\log^2n)M:\mathcal O(n\log n)\)。
算法二
直接考虑 boruvka 算法。每轮更新对于每个点 \(x\) 找到 \(\min_{c_i\ne c_x}(a_i+d(i,x))\)。使用换根dp可解决。颜色不同就求一个最大值和不同颜色的次大值。复杂度 \(T:\mathcal O(n\log n)M:\mathcal O(n)\)。
这种多树问题直接把其他树点分治掉,最后剩下一棵树。
直接把其中一棵树点分治掉,在另一颗树上建虚树即可。上述两个算法都可用,但时间多一个 \(\log\)。
P7470 [NOI Online 2021 提高组] 岛屿探险
简单CDQ。
区间变为前缀相减,不难发现按 \(b_i<d\) 和 \(b_i\ge d\) 分类讨论。
- 
\(b_i<d\) 此时满足 \(a_i\oplus c\le b_i\) 的 \(c\) 在01字典树上形如一条链的若干子树,可以单次 \(\mathcal O(\log)\) 查询。 
- 
\(b_i\ge d\) 此时满足 \(a_i\oplus c\le d\) 的 \(a_i\) 在01字典树形如一条链的若干子树,可以单次 \(\mathcal O(\log)\) 查询。 
有 \(r,d\) 两维限制,用CDQ即可。
P9068 [Ynoi Easy Round 2022] 超人机械 TEST_95
设 \(x_i\) 表示 \(i\) 在序列中的第1个位置,\(y_i\) 表示 \(i\) 在序列中的最后一个位置。那么一个本质不同逆序对可以表示为 \(i<j\land y_i>x_j\)。
还要考虑修改,一次修改操作只会改变\(O(1)\) 个元素的值,但这使得每个元素有的“生效时间”。
设 \((i,x_i,y_i,t_i,t'_i)\) 表示一个生效时间为 \([t_i,t']\) 的元素 \((i,x_i,y_i)\) 这太复杂了,考虑将他拆开。首先贡献在 \([t_i,t'_i]\) 可以改为两个后缀加减,然后把 \((x,y)\) 也拆开。
设 \((i,v_i,t,c=0/1,f=-1/1)\) ,表示一个对 \([t,q]\) 的时间加上 \(f\) 的贡献的元素,当 \(c=0\) 时,表示 \(x_i=v_i\),否则表示 \(y_i=v_i\)。
两个元素之间产生贡献可以写作:
然后对 \([\max(t_i,t_j),q]\) 加上 \(f_if_j\)。
拆 \(\max\),在较大出更新答案即可,维护 \(f\) 的和+CDQ 就可以做了。
复杂度 \(\mathcal O(n\log^2 n)\)。
一些代码细节:
- 
如果最开始排序时按照颜色,难以避免贡献到自己的情况。 所以最开始按照 \(v\) 排序,把颜色放在树状数组或内部顺序,都是可以处理的。 
- 
\(v\) 相同的时候,应该把 \(c=1\) 的排在前面,以便更新。 
感谢deepseek在一分钟之内调出我一个小时都没调出的错误(就是上面的细节2),感谢 hxz,way 帮我 debug。

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号