CF1684F Diverse Segments
考虑一个给定区间 \([l,r]\) 的所有颜色,对于每一个颜色 \(c\),有一个限制是 \([l,r]\) 内这个颜色出现至多一次。设其区间内出现的位置是 \(i_1,i_2,i_3\dots i_k\),显然可以将限制的区间缩小到 \([i_1,i_k]\)。但是这样的限制有 \(O(nm)\) 个,不能接受。
注意到,对于一种序列中出现 \(k\) 次的颜色 \(c\),对于这个颜色的 \(m\) 个限制中不同的右端点最多 \(k\) 个,对于每个右端点只需保留左端点最小的限制,这样就将 \(O(m)\) 个限制变成了 \(O(k)\) 个。所有颜色的限制最多只有 \(n\) 个。
考虑怎样能让 \([l_i,r_i]\) 中 \(x\) 出现至多一次这个限制被满足。设 \([l_i,r_i]\) 中 \(x\) 出现的位置是 \(i_1,i_2,i_3\dots i_k\),那么要求删除的区间要覆盖 \([i_1,i_{k-1}],[i_2,i_k]\) 之一。
满足这些条件的最小区间可以双指针求出。现在只需要考虑怎么求出所有限制。假如删掉了所有被包含的区间,那么按照左端点排序后,右端点也是递增的。枚举限制 \([i_1,i_k]\) 的 \(i_k\) 的位置,二分找到第一个右端点 \(\ge i_k\) 的区间,那么这个区间的左端点后第一个等于 \(a_{i_k}\) 的位置就是 \(i_1\)。\(i_2,i_{k-1}\) 可以在 vector 上二分得到。

浙公网安备 33010602011771号