CF1333 简要题解

构造场,虽然题目有点毒瘤但是还是很有趣的,请多来点这样的 round,我什么都不会做的。

  • A

考虑第一列和第一行染黑,其余染白的情况,发现恰好满足条件。什么,你问怎么想到的?这……

  • B

由于只能从左向右加,显然先让右边的元素满足条件最合适。因此无解的条件是:

  1. \(a_i<b_i\),且 \(\forall j<i, a_{j}\leq 0\)

或者

  1. \(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\) 的矩阵(或者它对称后的样子):

\[\begin{array}{ccc}9 & 6 & 5\\7 & 1 & 8\\3 & 2 & 4\\\end{array} \]

发现一直到 \(6\) 为止,rookqueen 的行动路线都是一样的,但是 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\),并输出答案序列的哈希值呢。


顺便提一句,抢在官方题解之前发布,很开心(

猜你喜欢

转载自www.cnblogs.com/suwakow/p/12669947.html