Codeforces Round #773 (Div. 1) 题解

再一次白给……E 十分可做结果现场开都没开(其实是开了也没时间写完),D 写 \(2^mn\log n\) 甚至跑不过 bitset 暴力。。。还好是小号,否则就要掉大分了 /dk/dk

A

直接模拟即可。碰到商为 \(x\) 的数对就将它们暴力配对。

B

一道很容易想复杂的题,现场卡了很久最后才发现是我想复杂了……

首先如果存在一种数出现次数为奇数那显然不行。考虑如何对于剩余的情况构造出一个合法的序列,我们找出第一个 \(i\) 使得 \(a_i=a_1\),然后在 \(a_i\) 后面插入两个 \(a_2\),在两个 \(a_2\) 后面再插入两个 \(a_3\),两个 \(a_3\) 后面插入两个 \(a_4\),以此类推。譬如 \(a\) 序列为 \(1,2,2,3,3,1\),那么我们就进行一次操作将序列变为 \(1,2,2,3,3,1,2,2,3,3,3,3,2,2\),然后将序列的前 \(10\) 分划分成一个符合要求的序列 \(1,2,2,3,3\mid 1,2,3,3,1\),这样我们再对后面的序列 \(3,3,2,2\) 构造即可,这样一来序列长度减少了 \(2\),并且剩余的序列依然满足每种数出现次数为偶数,归纳构造即可,总操作次数就是 \(\mathcal O(n^2)\),刚好符合本题的限制。

C

首先对于一条形如 0 l r 的信息,我们可以确定 \([l,r]\) 中的数都是 \(0\),这个可以使用 set 维护区间删点。对于一条形如 1 l r 的信息,如果我们发现 \([l,r]\)\(0\) 的个数恰好等于区间长度减 \(1\),那么我们可以确定区间中那唯一不是 \(0\) 的元素是 \(1\)。那么对于剩余的元素呢?显然,我们没办法知道剩余元素的值,因此当我们询问这些位置时,答案一定是 N/A

这样我们就能够确定最终每个位置的状态(是 \(0\) / 是 \(1\) / 不确定),但是对于此题,我们还要动态地维护一个已知消息的集合并根据集合中的信息,判定每个位置的状态。这个其实也比较好办,只需要再记录一下我们知道每个位置的状态的时间戳 \(t_i\) 就行了,对于最终状态为 \(0\) 的位置,我们就将其时间戳设为我们将其赋为 \(0\) 的时间,对于最终状态为 \(1\) 的位置 \(i\),我们枚举所有包含 \([l,r]\) 的区间,计算出 \([l,r]\) 中所有 \(0\) 被确定的时间与该区间的信息获得的时间的 \(\max\),设其为 \(v\),然后令 \(t_i\)\(v\)\(\min\)。这样每次询问只需检验确定的时间是否 \(\le\) 当前询问的时间即可。

D

奇奇怪怪题目,\(n2^m\log n(\approx 5\times 10^7)\) 跑不过 \(n\sqrt{n}+\dfrac{n^2m}{\omega}(\approx 7\times 10^8)\)……我也是无语了(

做法有很多,这里讲一种我的做法。考虑如何判断一个数组的集合 \(S\) 内是否存在一个与 \(a_i\) 不相交的集合。我们考虑 \(S\) 中的所有数组 \(a_x\),我们统计 \(cnt_T\) 表示 \(\sum\limits_{a_x\in S}[T\subseteq a_x]\),也就是 \(S\) 中有多少个数组 \(a_x\),满足 \(T\)\(a_x\) 的子序列,那么 \(c=\sum\limits_{T\subseteq a_i}cnt_T·(-1)^{|T|}\) 就是 \(S\) 中与 \(a_i\) 不交的数组个数,这个可以用容斥的思想来说明,因为 \(\sum\limits_{i=0}^n(-1)^i=[n=0]\),所有与 \(a_i\) 不交的数组恰好会对和式产生 \(1\) 的贡献,而所有与 \(a_i\) 相交的数组不会对和式产生贡献。

这样一来思路就比较明显了:二分答案 \(mid\),然后将所有数组按 \(w_i\) 排序,check 过程中按 \(w_i\) 降序枚举所有数组,这样所有与 \(w_i\) 权值之和 \(\le mid\) 的数组是一段前缀,two pointers 维护这个前缀集合的信息即可。

现场写了个线段树二分……当然过不去(

E

一道非常普通的多项式题。

考虑设 \(p_i\) 表示离 \(i\) 最近的关键点离 \(i\) 的期望距离,那么我们不妨先假设可以取空集,算出期望后乘个 \(\dfrac{2^m}{2^m-1}\) 即可。

考虑如何求 \(p_i\),我们设 \(sum_i\) 表示前 \(i\) 个点中关键点的个数,\(c_i\) 表示 \(i\) 是否为关键点,那么很明显我们要枚举离 \(i\) 最近的关键点是什么(如果有多个最近的关键点,我们不妨假设最左边的关键点离 \(i\) 最近),设其为 \(j\),这样距离 \(i\) 小于 \(i\)\(j\) 距离的关键点都不能被选,特别地,如果 \(j\)\(i\) 右边,那么离 \(i\) 距离等于 \(i\)\(j\) 的、且在 \(i\) 左边的关键点也不能被选。这样我们可以列出式子:

\[p_i=\sum\limits_{j=1}^{i-1}c_j·(\dfrac{1}{2})^{sum_{2i-j-1}-sum_{j-1}}·(i-j)+\sum\limits_{j=i+1}^{n}c_j·(\dfrac{1}{2})^{sum_j-sum_{2i-j-1}}·(j-i) \]

很明显可以想到拆为 左边带 \(i\) 项、左边带 \(j\) 项、右边带 \(i\) 项、右边带 \(j\) 项处理,以左边带 \(i\) 项为例,记 \(A_x=c_x·2^{sum_{x-1}},B_x=\dfrac{1}{2^{sum_{x-1}}}\),再设 \(C_z=\sum\limits_{x+y=z,x<y}A_xB_x\),那么这一部分对 \(p_i\) 的贡献就是 \(C_{2i}·i\)。而求解 \(C\) 是经典问题,可以使用分治 NTT 解决。这样复杂度是 \(n\log^2n\)

posted @ 2022-02-24 21:59  tzc_wk  阅读(177)  评论(0)    收藏  举报