IOI2024 nile
这道题整个的思考过程并不能说完全是我的一己之力,IOI day1 结束的晚上在机房中就有几个大佬爆了一些重要的观察/性质,并给出了线段树上维护矩阵乘法的 ddp 做法,但我并不会 ddp,于是利用这些性质找到了另外一种做法。
首先显然需要将 \(w\) 排序。
存在一种最优方案不出现交叉的配对。
考虑配对 \((i,j)\) 和 \((x,y)\),满足 \(i<x<j<y\)。
由于 \(w_j-w_i\le D\),则 \(w_x-w_i\le D\),因此配对 \((i,x)\) 和 \((j,y)\) 可以达到等价效果。
将一段长度为偶数且相邻两个都配对的序列称作配对段。那么最优方案实际上就是由很多配对段构成的。
对于某一个 \(D\),它会将整个序列分成若干极大的块,满足块与块间不能配对且块内总存在极长配对段。由于 \(B_i<A_i\) 的存在,我们总是想进行配对操作,对于一个块而言,如果其长度为偶数,将其全部配对一定是最优的;否则一定会有一个点没有配对,而这个点是可以在块中任意选取的,换言之,这个点最优一定是选择 \(A_i-B_i\) 最小的点。
但是,如果钦定某个点不被选之后左右两端的点无法匹配,这种情况是不优的。考虑该点一定是相对位置为偶数的点,那么左边会是奇数的一段,那么需要继续找一个点直到找到一个相对位置为奇数的点,这样不优于直接钦定最后找到的那个点不选。
这样贪心是正确的,对于每个块都这么贪心可以回答一组询问。实际上可以获得 \(67\) 分,这是赛时本题的第二档分。
接下来考虑多组询问,一个常见的技巧是将所有询问按照 \(D\) 排序,这样块一定会被不断合并。如何维护每个点是否可以被不选?考虑合并的两个块内部的一部分点肯定是仍然可以不选的,关键即是在于交界上的点。这样很好维护