record 6.3-6.5

* [CF1981 E]

我有点糖了。

可能会想一些 brovuka 一类的算法,但是不清楚能不能做。

事实上,可能有用的边是很少的。具体来说,如果有若干互相相交的线段,显然我们只用保留相邻两项之间的连边。

所以我们扫一遍,然后每个线段加入的时候向自己 \(a\) 的前驱后继连边,然后做 mst 就可以了。

[ARC179 B]

做的时候在分析一些神秘的东西,最后想了想感觉应该先做一做环的情况,但是好像还是不太会。

然后转念一想,我们有一个 \(m\le 10\),考虑一些暴力做法,比方说直接把这 \(m\) 个数上一次出现的相对顺序给压一下,发现 \(O(m!n)\) 过不去对吧。那我们就把这 \(m\) 个条件是否能被满足压一压,发现是可以转移的,这复杂度是 \(O(2^mn)\) 就没问题了。

[ARC179 C]

还行的一个题。

你先想想,我们先把限制卡到最死,\(R=\max(|A_i|,|\sum A_i|)\),然后干脆把整个序列都告诉你,你要怎么做。

一个比较显然的做法是,我们把正负数配对,这样加了之后,绝对值一定会比之前两个的最大值要小,所以不会 overflow。一直加直到全都是同号的,这时随便加就行了。

那你可以先排序,然后两两配对,这样复杂度是 2 log 的。发现烂完了。

但是我们没必要排序,只需要写一个堆就行了。复杂度 1 log。

但是卡常卡不动了。sol 用 merge sort + binary search,也可以,常数看起来就更好一点。

[ARC179 E]

这个题似乎比 D 简单。

我的想法是,发现它这个 merge 的限制是非常严的,所以我们把每个长方形看成一次变换,直接维护哪些合法长方形 input 进去会变成什么。

然后我猜测这东西是 \(O(n)\) 个单独的矩形再并上一个类似于 \((*,w)\to (*+x,w)\) 之类的东西。使用线段树维护即可。

然后阅读了 sol,发现它说得更好更清楚。

就是说,我们发现,如果你知道 \((l,r)\) 合并起来之后,打算跟 \(r+1\) 按哪个方向合并,那其实你已经知道了最后的大长方形的一条边了,然后其实你也知道面积,所以另一个边你也是清楚的,这样你就能判断到底能不能拼上去。所以你可以把一个长方形拆成两个点,分别表示两个合并方向,然后你固定一个 \(l\) 就会有一些边表示前一个按这个方向合并的时候,后一个可以按那个方向合并。对每个边而言,只有一个 \(l\) 满足条件,所以你自己怎么着维护一下就行了。

posted @ 2024-06-11 07:02  PYD1  阅读(4)  评论(0)    收藏  举报