Codeforces Round 1063 (Div. 2)部分题解

Codeforces Round 1063 (Div. 2)

D - Diadrash

easy

易知被包含的区间没有用处,完全覆盖它的区间一定更优,删掉这些区间,此时最多有 \(n\) 个区间,有了一个询问 \(n\) 次的做法。

考虑划定一个中心点 \(mid\),按中心点划分成两个半区(奇数时 \(mid\) 同时在两个半区,偶数半区无交)。

先询问横跨两个半区的区间,此时答案一定只存在于其中一个半区的所有区间中(因为 \(0\) 只能在一个半区),再询问剩下的半区就可以。

次数是 \(O(\frac{n}{2})\) 的,考虑无包含区间,每个区间都能占据一个新点,一个区间横跨半区,必然两个半区各占一个新点,此时加上半区内的区间,总点数是小于 \(\frac{n}{2}\) 的。

hard

同理只选择无包含区间,关键性质为:

\[mex_{l,r}=\min(mex_{1,r},mex_{l,n}) \]

因为限制区间 \(mex\) 的那个 \(k\) 只可能在前后缀其中一边。

同时前缀 \(mex\) 是单调不降的,后缀 \(mex\)\(1\) 开始记是单调不升的,两个函数在中间有交点,交点处即为答案,交点对应一个区间。

于是可以二分求交点,每次需要询问 \(2\) 次,总共 \(O(2\log n)\) 次。

E - Plegma

若第一列全 \(1\) 或全 \(0\) ,是好做的,全 \(1\) 时,任意一行的第一个数字也是 \(1\) ,考虑若四联通则问第一列,否则随便找一列不是全 \(1\) 的询问。

\(0\) 时,若四连通,找一列包含 \(1\) 的,否则给第一列。

上述两个询问归纳下来是将这一行第一个元素反转,我们设行第一个元素是 \(x\) ,若列中存在和 \(x\) 不同的元素,则连通性为 \(-x\) 否则为 \(x\)

因此当第一列 \(0\)\(1\) 都有时,我总可以选择这一列,行上根据连通性选择第一个元素为 \(0\)\(1\) 的行。

事实上不必被第一列这个限制束缚,找到一组行列按上面的分析能得到正确的连通性就可以。

posted @ 2025-11-11 13:18  蒻蒻虫  阅读(89)  评论(0)    收藏  举报