其他分享
首页 > 其他分享> > LGP8358口胡

LGP8358口胡

作者:互联网

一个 \(O(n\log V)\) 的做法。

首先这个走路径明显没用,实际上相当于每一列只能选一个元素。

考虑排序后的序列。我们先将 \(2n\) 个元素排序去重,然后枚举点对检查是否可能为答案。

设 \(g(i,j)\) 代表 \(|f_i-f_j|\),那么我们只需要令所有 \(g(x,y)<g(i,j)\) 的 \((x,y)\) 不能够同时选取即可。

可以大力枚举 \((x,y)\),然后建立 2-SAT 模型。正确性显然,复杂度 \(O(n^4)\)。

发现枚举 \((i,j)\) 没有什么意义,所以直接枚举 \(g(i,j)\)。

然后发现判定是有单调性什么的东西。。。于是直接二分就可以得到 \(O(n^2\log V)\) 的做法了。

发现一件事情,在排序后的 \(x\),对于 \(y\) 来说 \(x\) 一定是连续的一段。

也就是说在 2-sat 的加边中需要做一个区间加边。

这个线段树容易做到 \(O(n\log n\log V)\),猫树容易做到 \(O(n\log V)\),但是 \(O(n\log n)\) 空间。

不过我们还有 \(O(n)\) 空间的做法。

需要用到一个 trick(好像叫 baka's trick?)

大概就是说,对于 \(y\) 递增,\(x\) 一定也递增。所以是一个尺取的过程。

具体地,我们设有三个变量:\(L,R,mid\),对于 \(i\in[L,mid]\) 有 \(S[i]=merge(S[i+1],F[i])\),对于 \(i\in(mid,R]\) 有 \(S[i]=merge(S[i-1],F[i])\)。然后 \(S[mid]=F[mid],S[mid-1]=F[mid-1]\)。

然后在尺取的时候会出现 \(L\geq mid\),这个时候令 \(mid=R-1\),重构即可。

这个 \(merge\) 在这里对应的就是连边什么的东西。

容易知道这个的空间和时间都是线性的,所以能够做到 \(O(n\log V)\) 时间 \(O(n)\) 空间。

仔细想了一下好像猫树也可以做到 \(O(n)\) 空间,大概就是父亲节点序列上的值直接套用儿子节点序列上的值。。。(在这里是连边)

标签:log,mid,merge,枚举,排序,做到,LGP8358
来源: https://www.cnblogs.com/lmpp/p/16274108.html