CTS 2022 部分题解

5个lxl题已经公布,笑死。

Day2

A. 燃烧的呐球

复杂问题貌似 boruvka 严格比剩下俩厉害,因为所属关系每轮固定!

考虑 boruvka,相当于每次对于每个颜色,要找异色最小边。

如果 \(x, y\) 中至少有一个不呈祖先关系是平凡的,可以枚举另一边,在树上 dfs 做到 \(O(n)\),这样有可能数到祖先关系但默认成加法了,但没关系,因为 - 更小,会在数祖先关系的时候更新掉。

只需处理两个都呈祖先关系情况:

  • 当前两个都是祖先,线段树(单点修改,区间查询)合并,\(O(m \log n)\)
  • 当前一个祖先,一个儿子,按祖先维线段树(区间 \(\text{chkMin}\),单点查询)合并,\(O(m \log n)\)
  • 两个都是儿子,一个较劣但能接受的方法是,树剖把祖先拆成 log 个链的前缀,再使用区间 \(\text{chkMin}\),单点查询的线段树,这样是 \(O(m \log ^2 n)\),足矣通过。(应该能做到更优但较为复杂,例如可以先化为矩形 chkmin ,单点查询形式,然后一开始预处理那个(x 拆成 log 个区间)线段树结构,每个线段树(y 离散化后)位置按权值排序,然后每轮进去用线性并查集算出每个位置最优点值,还要定位离散化节点,把查询离线双指针,这样就 \(O(m \log n)\) 一次,太复杂,好像不可实现。。)

总复杂度 \(O(m \log ^3 n)\)\(O(m \log ^ 2n)\)

code

B. 袜子

没利用到随机性质,哈哈。

首先询问半平面点个数是可做的,一种做法 是分块后极角排序双指针,询问二分。

考虑这个题,考虑设定一个阈值 \(B\),颜色出现次数 \(>B\) 的之间套上面那个做法,小的考虑,每次把颜色相同的放到一组里,只需要动态维护一下这个顺序下,每个点有多少颜色相同的在它前面,并且快速求前缀和,这个可以树状数组,并且和排序同瓶颈。

既然出现次数都 \(\le B\) 了,那么我们分组可以把每块固定在 \([B, 2B)\) 范围内,这样每组都是 \(O(B)\) 的了。

总复杂度 \(O(B^2\frac{n}{B} \log { B^2} + q \frac{n}{B} \log {B^2})\),取 \(B = \sqrt{q}\) 最优,为 \(O(n\sqrt{q}\log q)\)

code

posted @ 2022-03-30 17:43  DMoRanSky  阅读(502)  评论(0编辑  收藏  举报