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}\)。
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))\),其实还有个反阿克曼函数,此处当作常数。
本文来自博客园,作者:lingfunny,转载请注明原文链接:https://www.cnblogs.com/lingfunny/p/18259758