[CF 392 Div.1 D]Three Arrays
题意
给三个由\(n\)个数组成的数组\(A\),\(B\)和\(C\),找一个最小的\(a+b+c\)使得\(A\),\(B\),\(C\)的对应前\(a\),\(b\),\(c\)个元素的并集恰好和\(A\),\(B\),\(C\)的并集相同
\(1\leq n\leq {10}^6\)
分析
我看课件上面描述的题意是这些数组是\(1\cdots n\)的排列……不过反正做法差不多。
考虑这种题目一般套路都是枚举一维,然后考虑剩下的。考虑枚举一个\(a\),判定最小的\(b+c\),我们对于每一个数\(i\),考虑将其视作若干个点对\((pB_i,pC_i)\),此时我们需要包含所有点的目标等价于找最大的\(pB_i\)和\(pC_i\)而已……
然后这个题目就很简单了,我们考虑对每个\(A\)里面的位置稍微处理一下当前这个位置的数是不是第一次出现,然后从后往前往表里面加(当然在最后的时候还需要将其他里面有但是这个里面没有的加进去)
感觉可以稍微换一下出成另一个题目,要求并集大小不小于某个\(K\),这样感觉上就是类似在一条折线上的维护,这条折线上的点包含的都恰好\(K\)个,然后加某个点进去会使得这一段“下陷”,实际上也就相当于一个类似维护凸壳之类的东西。不难发现,这里我们维护的这个下凸壳,因为我们某个点加进去之后肯定只会最多被“经过”一次(就是折线跨过去),那么我们完全可以找出这个点影响了哪一段区间的答案(这一段的折线需要下移),然后暴力找其中的若干个区间(因为某个点的覆盖使得区间中的一部分答案得到贡献)并直接向下覆盖即可。