Logo __vector__ 的博客

博客

Codeforces Round 836 (Div. 2) solution

...
__vector__
2025-12-01 12:56:01

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-08-22 16:34:22

A

正着来一遍,再倒着来一遍。

B

$n$ 是奇数:所有数字都相同就可以。

$n$ 是偶数:考虑最简单的 $n=2$ 的情况,此时答案是 $2,6$,然后,考虑偶数个数字异或和为 $0$,那么只需要前 $n-2$ 个填 $3$,最后两个填 $2,6$ 就可以。

C

坑点:直接匹配是错误的。

考虑从弱化版入手,不考虑 $a_1 = x$ 的限制。

那么对于 $i \in [2,n-1]$,$a_i = i$。

那么考虑现在的问题,对 $[2,n-1]$ 分配数字。

$[2,n-1]$ 可选的数字原来是 $2,3,\cdots,n-1$,加上 $a_1 = x$ 的限制后,可选数字失去了 $x$,加入了 $n$。

也就是说,如果其他位置保持不变,那么现在 $a_x = n$。

作一个猜测:有解当且仅当 $x | n$。

首先,$x$ 能整除 $n$ 时显然有解。

如果不能整除的话, $x$ 就需要其倍数去递补,但最后总有一个数不可递补。

如果有解,简单的设置 $a_x = n$ 可能不是最优的。

考虑 $x$ 与其最近的,能整除 $n$ 且是 $x$ 倍数的位置进行交换,反复进行,直到不存在可交换的小于 $n$ 的位置。

维护这个操作,只需要每次交换时计算 $\frac{n}{x}$,求这个东西的最小质因数 $y$,然后 $x$ 与 $xy$ 交换就可以。

每个数的最小质因数可以用筛素数同样原理的方法求出来。

D

如果数列最小值,最大值已经确定,那么设数列能得到的出来的最小总和为 $x$,最大总和为 $y$,那么这个序列能表示出 $[x,y]$ 之间的所有总和。

根据上述,如果固定了极差,那么可以二分求合法的数列最小值。

猜个结论,只要极差够大,一定能存在一组合法解。

这里取极差为 $5n$,实测可以通过。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。