Codeforces Round #953 (Div.2)

Codeforces Round #953 (Div.2)

# Who = * A 500 B 750 C 1250 D 1500 E 2000 F 2500 Π Δ Final
774 Iingfunny 3668 492
00:04
729
00:07
1145
00:21
1302
00:33
1929 +427 N/C

记号约定:\(a/b=\frac{a}{b}\)

bilibili

1978A Submission

观察性质题,注意到最后一个必选,前面的任意选。

时间复杂度 \(\Theta(n)\)

1978B Submission

直接构造题,对于第二种卖法在 \(b-k \ge a\) 的时候都是第二种更优。

时间复杂度 \(\Theta(1)\)

1978C Submission

考察对排列的理解。首先是距离最大的时候应该是 \(i>n/2\) 的数在左半部分, \(i<n/2\) 的数在右半部分。判定问题通过对称性可知道限制条件为偶数,于是令 \(k\gets k/2\)

接下来考虑构造,最朴素的是只考虑交换 \(i\)\(n-i+1\),贡献为 \(n - 2i + 1\) 于是变成用所有奇数或者所有偶数构造出 \(k\)

可以发现这个在偶数的时候大概率构造不出来 \(k\),考虑添加一些别的交换,但是一个交换必须在有特殊限制的条件下才比较好考虑其贡献,比如完全有序的情况下,交换 \((i, j)\) 产生 \(j - i\) 的贡献。

考虑在之前的基础上构造,对于某次 \(i\)\(n - i + 1\),如果此时产生的贡献大于 \(k\),就交换 \((i, i + k)\),于是得到正解。

时间复杂度 \(O(n)\)

1978D Submission

分类讨论题。从简单的情况开始考虑:只有一号,此时分类讨论两种 \(a_1 + c \ge \max\)\(a_1 + c < \max\)

类似的,考虑 \(i\) 号,此时 \(\max = \max\{a_1+ c, a_2, \cdots, a_{i-1},a_{i+1},\cdots,a_n\}\),分别判断大于小于和等于。

时间复杂度 \(\Theta(n)\)

1978E Submission

看起来不像是特殊数据结构题,并且只有查询。

先手玩一下小情况,不难感觉到修改是有限的,而且可以只先做操作 1,最后再做操作 2。

通过有限这一性质,不难想到莫队。其次,左右端点向内缩的时候有点难想,考虑使用回滚莫队,但是要注意:

  • 做操作 2 的时候,不能直接修改 \(a\) 数组导致操作 1 误判,只能打标记。

随后阅读了一下官方题解:考虑到查询整个串和查询某个区间的差别只在于边界的两个字符,尝试硬讨论这边界的两个字符即可。提交记录是官方做法,但是多判断了几个字符。

时间复杂度 \(O(n)\)

1978F Submission

首先通过性质简化题意,由 \(k\ge 2\) 注意到,和主对角线平行的线上的点都是联通的(\(1\) 除外,但是 \(1\) 不可能和其他形成连通块,于是可以直接不讨论了)。

于是你把主对角线拉出来,得到一个序列 \(\{a_2, a_3, \cdots, a_n, a_1, a_2, \cdots, a_n\}\)。于是问题简化为在序列上的两个点连边,问最后有几个连通块。而连边的限制是:

  • \(\gcd(a_i, a_j) > 1\)
  • \(\lvert j - i\rvert \le k\)

遇到 \(\gcd\) 问题不妨从素数幂考虑,这里只需要考虑素数。对于某个素数 \(p\),我们可以找到有哪些数字含有这个质因子,于是你得到了一些不(一定)连续的位置,要在它们距离 \(\le k\) 的点之间连一条边。不过这题是求连通块数量,于是图可以拉成一棵从左到右的、线性的树,只在相邻两个点距离 \(\le k\) 时连接。

再次利用这个性质,不用显式建图,只需要用并查集维护连通性即可。

至于找出有哪些位置含有质因子 \(p\),可以埃氏筛预处理出每个正整数的质因子,时间复杂度 \(\Theta(n\log\log n)\)。然后在序列中直接遍历质因子即可,时间复杂度 \(O(n\omega(n))\)

总时间复杂度 \(O(n\omega(n))\),其实还有个反阿克曼函数,此处当作常数。

posted @ 2024-06-21 01:14  lingfunny  阅读(36)  评论(0编辑  收藏  举报