泡泡糖

好久没写博客了,上一篇公开的博客还是 NOI 那段时间写的。好像泡泡糖还没人说过怎么做,我来说一下吧。QOJ 难度 6,根本不会做诶。

\(m\) 并不大,但一开始就往状压之类的地方想就完蛋了。即使确定每个位置的排名好像也无法给出一个有道理的构造,所以我们必须抛开【确定相对大小关系】这一点,尝试别的方向。

重要的一步转化是,将 \(|a-b|\) 视作 \(\sum\limits_{x}[a\leq x\cap x+1\leq b]\),这个转化在 Permutation on Tree 中亦有提及。接下来我们从单个 \(x\) 的视角去看待整个问题,好处是值域被简化为了 \(01\),先只考虑最小化这个 \(x\) 上的贡献。很容易在 \(O(nm2^m)\) 的时间复杂度内解决,转移采用 FWT 即可。

事实上,最终答案就是所有 \(x\) 的答案相加,证明这点只需要证明按照任意顺序枚举 \(x\) 对值域进行分裂,对于每个 \(x\) 取到的都一定是最小贡献。证明我也不是很会,大概是,只考虑两次分裂 \(x,y\),令 \(x>y\),则矛盾只有第一次分裂 \(>x\) 和第二次分裂 \(\leq y\),可以说明这种一定不会出现?

每次选一个等价类分裂的话要分裂 \(O(nm)\) 次。但实际上分裂时没有必要扫一遍整个矩阵,若一列上有需要分裂的等价类才枚举这一列,采用分治的方法分裂等价类,这样一列最多出现在 \(O(m\log nm)\) 次分裂内,总的时间复杂度为 \(O(2^mnm\log nm)\),吧。

实现的话,solve(l,r,L,R) 代表第 \(l\sim r\) 列,所在值域等价类为 \([L,R]\),对其进行分裂。

感觉有点怪怪的,有点累累的,代码睡醒再说吧。

爱你三千遍。

posted @ 2026-10-04 14:57  BYR_KKK  阅读(73)  评论(0)    收藏  举报