CF1333 简要题解
构造场,虽然题目有点毒瘤但是还是很有趣的,请多来点这样的 round,我什么都不会做的。
- A
考虑第一列和第一行染黑,其余染白的情况,发现恰好满足条件。什么,你问怎么想到的?这……
- B
由于只能从左向右加,显然先让右边的元素满足条件最合适。因此无解的条件是:
- \(a_i<b_i\),且 \(\forall j<i, a_{j}\leq 0\);
或者
- \(a_i>b_i\),且 \(\forall j<i, a_j\geq 0\)。
- C
还算简单的题目,稍微卡了一小会。
设 \(s_i=\sum_{j=1}^i a_i\),则一个区间 \([l, r]\) 是 “不好的”,当且仅当 \(s_{r}-s_{l-1}=0\),即 \(s_r=s_{l-1}\)(注意 \(s_0=0\))。
由左向右枚举答案的右端点 \(x\),考虑哪些左端点 \(y\) 是合法的:显然对于其左的所有 “不好的” 区间 \([l_i, r_i]\),有 \(y>l_i\),除此之外没有其他限制。
因此,扫描时对于每个子区间的右端点 \(r_i\),求出它左边可以和它构成 “不好的” 区间的最大的 \(l_i\),就可以算出每个 \(x\),在哪段范围内的 \(y\) 是合法的,这一步可以用 map
简单完成。
- D
考虑两个学生翻转方向的过程,其实相当于互相交换了位置。因此,原序列可以看作一个 \(01\) 串,我们的目的是将它排序,每次可以选中若干个的 10
,并将它们交换位置。要求在恰好 \(k\) 次内完成。
注意到每次交换一个 10
,都恰好消除了一个逆序对。因此 \(k\) 大于逆序对总数的情况下无解。
另外,每次选中一些 10
前,每个 10
都是互不相交的,因此可以每次将所有可能的 10
都选中,不难看出这是最快消除所有逆序对的方式。设如此操作一共花了 \(x\) 步,那么 \(k<x\) 的情况下也无解。
否则,我们需要把 \(x\) 步中每一步选出的位置分成若干个非空子集,使得最后有恰好 \(k\) 个子集,方案不难构造。
- E
看起来是最难的一道题,实际上……确实是最难的(
vp 场上没做出来,赛后花了点时间研究出来了。
首先 \(n\leq 2\) 的时候,queen
可以一步到达任意位置,所以无解。
\(n=3\) 的时候可以先打个表,然后发现可行的方案非常多(虽然大部分方案都是对称的)。
如果你运气好或者善于观察,可以发现这样一个 \(3\times 3\) 的矩阵(或者它对称后的样子):
发现一直到 \(6\) 为止,rook
和 queen
的行动路线都是一样的,但是 queen
会选择 \(6\rightarrow7\rightarrow8\),从而无法回到 \(9\)。这启发我们,由于 queen
包含了 rook
可能的所有操作,我们先诱导它们,在前面的绝大部分路程中都走过相同的路径,而在临近终点时,利用 queen
可以斜向贪心的性质,将它引诱到某个岔路上去。
在上面的矩阵中,\(6\rightarrow7\rightarrow8\) 这条路线就引诱了 queen
贪心地追求 \(7\)。
因此我们可以直接在这个矩阵的基础上拓展,详见代码:
for (R int i = 2; i < n; ++i) ans[2][i] = ++cnt;
for (R int i = 3; i <= n; ++i) {
if (i & 1) {
for (R int j = n - 1; j; --j)
ans[i][j] = ++cnt;
}
else {
for (R int j = 1; j < n; ++j)
ans[i][j] = ++cnt;
}
}
for (R int i = n; i > 2; --i)
ans[i][n] = ++cnt;
for (R int i = n; i > 2; --i)
ans[1][i] = ++cnt;
ans[1][2] = ++cnt, ans[2][1] = ++cnt;
ans[2][n] = ++cnt, ans[1][1] = ++cnt;
注意此处实际上将上面的 \(8\) 看作放在了第 \(n\) 列。
- F
诶 dls 怎么秒了,大概是原题,先做这个吧。
诶大家怎么都秒了,哦原来是真的水(
首先一个直观的认识是,\(k\) 比较小的时候只选质数和 \(1\),可以保证 \(\max(\gcd)=1\)。
考虑某个合数 \(x=p\cdot q\),则对于任意的 \(y\),有 \(\gcd(x, y)\geq \max(\gcd(p, y), \gcd(q, y))\)。也就是说,如果我们选了某个合数 \(x\),必然会先选它所有的因子,否则必然不优。
此时考虑一个新加入的 \(x\) 的贡献:由于 \(x\) 在之前还没有选,\(x\) 的倍数也不可能被选。因此新增 \(x\) 后,它产生的贡献是 \(\gcd(x, \frac{x}{p})=\frac{x}{p}\),其中 \(p\) 是 \(x\) 最小的质因子。
于是就做完了,筛出每个 \(x\) 最小的质因子 \(p\),按照 \(\frac{x}{p}\) 排序后逐个加入即可。
实际上由于不需要输出方案,考虑每个 \(y\) 作为答案存在的区间,其实就是有多少个 \(x\) 满足 \(\frac{x}{p}=y\) 而已,按照 \(y\) 从小到大输出它对应的区间长度次即可。复杂度 \(O(n)\),瓶颈在于线性筛最小质因子。
所以为什么不让 \(n\leq 3\times 10^7\),并输出答案序列的哈希值呢。
顺便提一句,抢在官方题解之前发布,很开心(