Codeforces Round 969 (Div. 1 + 2)

A

将序列转化为 01 串,奇数为 1,偶数为 0
容易发现两个 0 不能分在同一组,于是答案的上限取决于奇数的个数,并且容易构造方案达到这个上界,随便做做就行。

B

将序列排序后,发现不管怎么加,大小顺序不变,记录下最大值按题意模拟。

C

根据基本数论知识可得,操作等价于加上 gcd(a,b),所以在 mod(a,b) 意义下数不变,记录一下所有数枚举断点。

D

容易发现产生贡献只能是根节点和叶子结点的值不一样。

将问题转化为一堆叶子未确定和一堆叶子已确定。

当根节点是确定的,而且先手先填,所以如果有 x 个问号,那么先手可以多拿 x2 个贡献。

否则,就要开始分讨,我们先要证明一个引理,就是先手和后手他们填的数不可能相同。证明也很简单,他们可以进行反悔,如果给对手多了一个贡献,那么他可以回之前操作取消。

因此,如果叶子里面 01 个数不同时,先手会优先把根节点选好,然后对于问号,只能拿 x2 贡献。

相同时就大家都不选根节点,选完其它叶子结点再选根节点最优。

E

容易发现一条链只有所有边都被确定时才达不到上界。由于点是 dfn 序,有查询相邻节点,所以一条边只会经过两次,暴力维护即可,思维难度不如 D。

F

赛时止步于此。

究极神秘结论题。

题意:定义一个正整数集合是合法的:你可以任意次取出集合中的正整数 x,y,满足 x,y 同奇偶性,且不在集合中,然后把它加入集合。做到无法再做为止,最终集合内的数必须连续。给定序列,求有多少个子区间内的数组成的集合是合法的。

考虑将原序列变为很多段差分。差分可以将问题统一化。
先考虑只有两个数,差分为 d,明显,d 只能有 2 的因数。
考虑一大堆数差分结束条件,将所有的 2 因子去除后,就是所有的差分都相同才能结束。
我们可以猜最后这个数是什么。首先猜个下界:gcdi=lr1di,幸运的是,我们总能构造出一种方案使其满足。

所以问题就很简单了,就是查询有多少段 l,r,满足 gcdi=lr1di =1

Div 1 D

中文题解有没有树脂。错了也不改一改,硬控我很久。

考虑不进行 2 操作,将原序列从小到大排序后,最优的排列一定是:an,a1,an1,a2,an3...

交换即可证明。

考虑 ai×ani+1 这种条件很难维护,我们将其拍扁到值域上。
接下来就是官方中文题解式子的错误,令 c(l,r) 表示一段数内值域在 [l,r] 间的数的个数,需要满足:

i[1,k],c(1,i)c(ki+1+1,k)

贪心的,把非法的序列变合法,一次 2 操作相当于减少两个最大值,随便维护,注意若 n 为奇数,中间一项不必管。

时间复杂度 O(qk)

posted @   g1ove  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示