这种题都做不出来我还打个集贸的 OI 啊

_Alexande_ / 2024-10-23 / 原文

不是,这种题没想出来,如此,如何备战 CSP。

description

给定长度为 \(n\) 的序列 \(a\),以及 \(m\) 个数对 \((l_i,r_i)\)
你可以进行下列操作至多一次:

  • 选择序列 \(a\) 的一个子段,并将其中的每个元素的值都改成任意整数。

你需要保证执行完操作之后,对于每个整数 \(i(1\leq i\leq m)\),都有 \(a[l_i,r_i]\) 中所有元素互不相同。
你需要最小化操作时选择的子段的长度,并求出这个长度的最小值。
特别的如果没有必要进行操作,答案为 \(0\)

solution

首先考虑这么一件事情,令每个位置如果保留必须需要去掉的一段连续区间 \(l_i, r_i\),我们默认 \(l_i > i\)。这个可以用线段树 cover 操作解决。

然后,我们对于每个左端点,二分右端点,相当于我要判断其他之外的点的最小的 \(l_i\) 和最大的 \(r_i\) 是否被当前的区间覆盖,然后当然我们维护一个前后缀 max / min 即可。

\(l_i, r_i\) 说得详细点就是需要保留目前点必须要覆盖的一些点的连续区间。

君,如无能解此题,如何备战 CSP?

然后自己懒得写代码了。