改·LOJ #535. 「LibreOJ Round #6」花火

题目code

首先分析题目,容易看出特殊交换可以看做只会在一开始用。因为本质上能理解为两数置换。
然后无特殊操作的操作数显然是逆序对数总和。那么特殊操作无疑是来最小化逆序对数的。
于是题目就转换成了交换两数,最小化逆序对数。

容易发现交换两数的贡献只与位置在\([l+1,r-1]\)且值在\([a_l-1,a_r+1]\)点的个数有关。(显然\(a_l>a_r\)
直接上二维坐标图像。容易观察到\(l\)\(r\)的可能取值可以用单调栈分别求出。
观察图像性质,可以得到每个点的贡献都是一段\(r_i\)\(r_j\)和一段\(l_i\)\(l_j\)
于是直接扫描线扫\(r\),每次加点和删点。用线段树维护每个\(l_i\)次数于当前\(r_j\)形成矩形点数。
实现时稍微注意点细节。代码较为好写,不是很繁琐。

一开始思考这题的时候甚至想的是维护差分数组,然后再看其前缀和的最值。
写代码时才发现自己想烦了。就换了上面更为清晰直接的思路。

这题就是启示上来先思考题目条件,操作,贡献等实质。转换成清楚的模型。
然后利用最优化思想筛选出可能点,利用其性质观察到每个点影响的范围。
一句话,能简就简,能优就优,然后单点分析贡献。

posted @ 2023-04-13 23:14  sjcx  阅读(62)  评论(0编辑  收藏  举报