先考虑如果所有的 T
已被排除,剩下的位置怎么判断是 R
还是 S
。
注意到每种细菌可以在样本中放入任意多个,容易想到经典的套路:将 \(8\) 个位置一起处理,第 \(i\) 个在样本中出现 \(2^{i-1}\) 次,再加入一个 T
。若结果 \(\land 2^{i-1}=2^{i-1}\),则第 \(i\) 个对应的位置为 S
,否则为 R
。这部分一共需要 \(\frac n 8\) 次查询。
接下来考虑怎么排除所有的 T
。发现 \(t\le 30\),容易想到二分。如果直接做需要 \(8t\) 次操作,无法接受。考虑仿照之前的思路进行分块,每次处理 \(8\) 个位置,一次查询可以判断是否存在 T
。若存在,则可以得到块内所有 S
的位置,剩下一堆 T
和 R
。
对每个含 T
的块二分出第一个 T
的位置,可以得到这个位置之前的都为 R
。接下来考虑将 T
后面的位置全部加入一个集合,再对这个集合处理出每个位置为是 T
还是 R
。
继续仿照之前的思路,每次取出 \(8\) 个位置处理。一次查询可以得到这些位置全部为 R
,或存在 T
。存在 T
则跟之前一样二分,然后再排除一些数。由于所有的二分都是有效的(可以找到一个 T
),所有非 T
的位置操作数是接近 \(\frac n 8\) 的,所以总操作数接近 \(3t+\frac n 4\approx 165\),只能获得 \(75\) 分左右。
注意到二分部分每次询问的位置数较少(\(\le 4\)),考虑利用这些空位处理一些非 T
的位置。每次二分判断的时候取出 \(8\) 个非 T
的位置一起判断(\(2^8+4<300\))。再通过将位置随机打乱,可以将总询问数做到 \(150\) 次以内,通过本题。查询次数最多的数据查询了 \(148\) 次,限制还是比较紧的。