P7971 [KSN2021] Colouring Balls

· · 题解

入 OI 以来做的第二道交互题。

题目传送门

题意简述

n 个颜色未知的球,你现在可以通过 Q 次询问,每次询问一个区间 [l,r] 中球的颜色数,需要你确定最后的所有球的颜色异同。

数据范围 n \leq 10002000 \leq Q \leq 10000Q 的范围与子任务特性有关。

一般性解法

先可以不考虑子任务,考虑 n=1000,Q=10000 时怎么做。

首先我们可以从 n 号球推到 1 号球,假设当前的颜色已经出现了 k 个不同的,分别为 c_1,c_2,c_3\dots c_k,它们出现的 最靠前的位置 分别为 p_1,p_2,p_3\dots p_k,满足 p 序列升序。

那么假设当前需要求解 i 号球,那么在 [1,k] 中二分一个 p_{mid},可以自行想象一下,如果询问区间 [i,p_{mid}],得到的结果是 res,如果

最后就可以通过二分得到答案。这里举一个 col=[1,3,2,2,2,1] 的例子求解 col_1 以便大家理解。

这样需要询问 n \log_2 n,实测可以通过 Q=10000 的子任务。

数据分治

不知道正解是否需要,但是我的需要。

颜色段连续,所以对于每一个球 i,只需要询问 [i,i+1] 即可知道异同关系。询问次数为 n-1

照常做,用一般性解法,询问次数大约为 2n-2

每次询问区间 [i,n],如果 res_{i,n}=res_{i+1,n},那么就二分,否则就是新颜色,询问次数大约为 n+\log_2 n

有点意思。

当颜色数为 4 时,那么就不可能出现新颜色。一个可能二分的过程是这样的。

你会发现这样子每一个球会询问 3 次,总询问次数约为 3n 无法通过。

怎么优化呢?

突破口就在于 不可能出现新颜色,所以当二分区间 [l,r] 满足 l=r 且颜色数为 4 时,那么 col_i=c_l,因为 只有这一种颜色可选,又不可能出现新颜色。这样就可以将询问次数降到 2n 级别,可以通过。

放在最后

很好的一道题。我才不会告诉你我做了很久。 代码就不放了(太丑了)。

完结撒花。