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=ab

bilibili

1978A Submission

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

时间复杂度 Θ(n)

1978B Submission

直接构造题,对于第二种卖法在 bka 的时候都是第二种更优。

时间复杂度 Θ(1)

1978C Submission

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

接下来考虑构造,最朴素的是只考虑交换 ini+1,贡献为 n2i+1 于是变成用所有奇数或者所有偶数构造出 k

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

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

时间复杂度 O(n)

1978D Submission

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

类似的,考虑 i 号,此时 max=max{a1+c,a2,,ai1,ai+1,,an},分别判断大于小于和等于。

时间复杂度 Θ(n)

1978E Submission

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

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

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

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

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

时间复杂度 O(n)

1978F Submission

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

于是你把主对角线拉出来,得到一个序列 {a2,a3,,an,a1,a2,,an}。于是问题简化为在序列上的两个点连边,问最后有几个连通块。而连边的限制是:

  • gcd(ai,aj)>1
  • |ji|k

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

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

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

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

posted @   lingfunny  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示