构造场,虽然题目有点毒瘤但是还是很有趣的,请多来点这样的 round,我什么都不会做的。
- A
考虑第一列和第一行染黑,其余染白的情况,发现恰好满足条件。什么,你问怎么想到的?这……
- B
由于只能从左向右加,显然先让右边的元素满足条件最合适。因此无解的条件是:
- (a_i<b_i),且 (forall j<i, a_{j}leq 0);
或者
- (a_i>b_i),且 (forall j<i, a_jgeq 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 场上没做出来,赛后花了点时间研究出来了。
首先 (nleq 2) 的时候,queen
可以一步到达任意位置,所以无解。
(n=3) 的时候可以先打个表,然后发现可行的方案非常多(虽然大部分方案都是对称的)。
如果你运气好或者善于观察,可以发现这样一个 (3 imes 3) 的矩阵(或者它对称后的样子):
发现一直到 (6) 为止,rook
和 queen
的行动路线都是一样的,但是 queen
会选择 (6
ightarrow7
ightarrow8),从而无法回到 (9)。这启发我们,由于 queen
包含了 rook
可能的所有操作,我们先诱导它们,在前面的绝大部分路程中都走过相同的路径,而在临近终点时,利用 queen
可以斜向贪心的性质,将它引诱到某个岔路上去。
在上面的矩阵中,(6
ightarrow7
ightarrow8) 这条路线就引诱了 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=pcdot 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)),瓶颈在于线性筛最小质因子。
所以为什么不让 (nleq 3 imes 10^7),并输出答案序列的哈希值呢。
顺便提一句,抢在官方题解之前发布,很开心(