Codeforces Round 969 (Div. 1 + 2)

A

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

B

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

C

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

D

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

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

当根节点是确定的,而且先手先填,所以如果有 \(x\) 个问号,那么先手可以多拿 \(\lceil\frac{x}{2}\rceil\) 个贡献。

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

因此,如果叶子里面 \(0\)\(1\) 个数不同时,先手会优先把根节点选好,然后对于问号,只能拿 \(\lfloor\frac{x}{2}\rfloor\) 贡献。

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

E

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

F

赛时止步于此。

究极神秘结论题。

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

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

所以问题就很简单了,就是查询有多少段 \(l,r\),满足 \(\gcd_{i=l}^{r-1} d_i\ =1\)

Div 1 D

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

考虑不进行 \(2\) 操作,将原序列从小到大排序后,最优的排列一定是:\(a_n,a_1,a_{n-1},a_2,a_{n-3}...\)

交换即可证明。

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

\(\forall i\in[1,\lfloor\sqrt k\rfloor],c(1,i)\ge c(\lfloor\frac{k}{i+1}\rfloor+1,k)\)

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

时间复杂度 \(O(q\sqrt k)\)

posted @ 2024-09-04 16:31  g1ove  阅读(6)  评论(0编辑  收藏  举报