25.10.20联考题解
Operator Precedence
sb 构造题,随便做一下即可。下面给出一种构造方案:\(2,-1,2,-1,\dots,2,-1,2n,-1\)。
列车员
简单计数题。
考虑第一问,直接我们将区间按照右端点排序贪心即可。
考虑第二问,我们首先可以离散化,把整个路线划分成若干段。我们先考虑一个暴力的 dp,设 \(f_{i,j}\) 表示考虑了前 \(i\) 段我们已经填了 \(j\) 个点使得所有与前 \(i\) 段有交的区间合法的方案数。转移是简单的,考虑当前段是否要填关键点,如果要那么就从一个 \(f_{k,j-1}\) 转移过来再乘上当前段的长度;否则就继承前面的信息。这样的复杂度是 \(\mathcal O(n^3)\) 的,你用一些简单的优化可以做到 \(\mathcal O(n^2)\),但是这不重要。因为考虑到你的 dp 状态数已经是 \(\mathcal O(n^2)\) 了,所以我们尝试干掉一维。
考虑到我们选择关键点的时候是贪心的,所以其实我们上面的 dp 中第二维有很多东西是无意义的,所以我们考虑一个新的 dp,设 \(f_i\) 表示考虑了前 \(i\) 段并且钦定必须填第 \(i\) 段,在满足贪心填关键点且合法的情况下的方案数。
我们考虑转移,因为是按照贪心来进行 dp 的,所以我们的想法是从选择第 \(i\) 个关键点转移到选择第 \(i+1\) 个关键点,然后就有转移:
其中 \(\text{len}_i\) 是当前段的长度,\(f_j\) 是可以转移的段。接下来我们就只需要考虑哪些 \(j\) 是合法的,然后就可以快速转移了。
注意到我们贪心求第一问的时候实际上每次选择的是关键点的右边界,因为我们是排序然后每次取没有被覆盖的区间的右端点。如果我们倒着做一遍那么我们就能得到每个关键点的左边界,那是不是就做完了?
其实不然。可以参考样例一的解释,就是说虽然一个关键点填的区间我们确定了,但是具体填到某个位置之后我们能够进行转移的区间可能不太一样。考虑一个区间在当前段的左边,那么我们就不能从这个区间的左边转移过来,因为这里我们会漏掉这个区间,就不满足全部覆盖的要求了。所以我们要处理出这个限制,显然这个东西是单调的,于是你就提前预处理出这个限制,然后正常扫一遍进行 dp,转移用单调队列维护即可。当然你也可以像我一样写一个树状数组,前提是你要天生自带小常数。时间复杂度 \(\mathcal O(n\log n)\)。
信使 Messenger
堂提。
考虑设 \(\text{ans}_{i,j,k}\) 表示从 \(i\) 到 \(j\) 走 \(k\) 步的答案。然后考虑转移的时候只能钦定一个端点不经过于是考虑容斥。这里我们钦定 \(i\) 没有经过去容斥 \(j\),设 \(f_{i,j,k}\) 表示不经过 \(i\) 的答案,设 \(g_{i,j,k}\) 表示从 \(i\) 走 \(k\) 步走回来并且不经过 \(j\) 的答案。然后就有:
考虑如何转移 \(g\)?我们可以类比上面的 ans,设 \(h_{i,j,k}\) 表示 \(i\) 走 \(k\) 步到 \(j\) 的答案。转移和上面的类似:
然后就做完了,时间复杂度 \(\mathcal O(n^3d+n^2d^2)\)
进行一个魔的除 I
考虑两个人的策略。
考虑先手。只要有 1 那么先手一定会至少删一个,于是只有当前全为 0 的时候才会出现 1 的个数 +3 的情况,否则只会增加 \([1,2]\) 个 1,于是先特判掉初始全为 0 的情况,处理方式就是记录一下并把 \(a_1\) 赋值为 1。然后为了让游戏轮数尽量多,先手会去处理连续的两个 1,考虑这样一定不劣。我们从 1 的个数考察这个游戏,考虑游戏的过程一定是 1 的个数每次增加 1 然后中间有一段 +2 后面又是 +1,于是先后手会围绕中间那段 +2 进行博弈。
考虑后手。后手可以先假装先手把初始所有的连续的 1 都删掉了(因为先手策略是固定的),然后再填入若干的 1。后手为了最大化 +2 的次数,那么他一定会间隔一个位置放一个 1。于是我们考虑所有 0 的连续段,假设一段长度为 \(len\) 那么能够放 1 的数量就是 \(\left\lfloor{len-1\over2}\right\rfloor\),然后特判首尾即可。

浙公网安备 33010602011771号