CF1408H
其实不难,算是给最近的训练涨了 eps 信心。。。讲述一个 \(O(n\alpha(n))\) 的方法,如果使用线性序列并查集可做到 \(O(n)\)。
首先考虑 \(0\) 的位置,则显然一定使用前 \(m\) 个 \(0\) 与后 \(m\) 个 \(0\)。所以找到 \(0\) 的分割点 \(mid\),则可以分为 \([1,mid]\) 与 \([mid,n]\) 分别考虑前后缀。然后一个有趣的观察就是:对于中间的数 \(a_{j_p}\),若其 \(\le mid\) 则只需关系其是否能匹配前缀的 \(0\);否则是关心是否匹配后缀的 \(0\)。于是最终解的形态可以表示为 \((x,y)\),其中 \([p_0,mid],...,[p_x,mid]\) 中各自寻找 \(a_{j_p}\),然后在 \([mid,p_y],\cdots,[mid,p_c]\) 各自寻找 \(a_{j,p}\) 后要求 \(a_{j,p}\) 不等即可。
于是对于一个 \((x,y)\) 的判断就可以用 Halls 定理。其本质上只有三种情况需要判定:\([i\le x,x]\) 的点;\([y,j \ge y]\) 的点;以及 \([i \le x,x]+[y,j \ge y]\) 的点判定一下区间中本质不同的数是否 \(>\) 点的个数即可。这样复杂度做到 \(poly(n)\)。
然后考虑最优的 \((x,y)\) 是什么样的。考虑在上述判定中,找到最大的 \(y_0\),满足 \((0,y_0)\) 符合条件,然后再找到最大的 \(x_0\) 使得 \((x_0,y_0)\) 符合条件。接着考虑 \(y_0\gets y_0-1\) 对 \(x_0\) 的移动,分析几种情况:
- 若 \(x_0\) 已经到达了 \((x_0,0)\) 的极限,显然 \((x_0,y_0)\) 最优;
- 否则根据限制 \(3\) 一定存在 \(i,j\),满足 \(cnt(p_i,p_j)=x_0-i+1+j-y_0+1\);所以当 \(j \not= y_0\) 时,则 \(x_0\) 最多 \(+1\),所以调整不优。
- 然后惊讶的发现,当 \(j=y_0\) 时,相当于转换为 \(cnt(p_i,p_j)=x_0-i+1+1\);而又因为 \(cnt(p_i,p_j) \ge cnt(p_i,mid)\),所以 \(x_0 \gets x_0+1\) 后一定会达到 \((x_0,0)\) 的极限,依旧得到调整不优。
所以直接找到最大的 \(y_0\),然后再找到 \(x_0\) 即可。这里需要求:后缀 \(-1\) 整体查 \(\min\),可以只用并查集维护后缀 \(\min\) 即可,复杂度 \(O(n\alpha(n))\)。
浙公网安备 33010602011771号