前言
-
powered by 翘课协会
-
感谢 @pitless0514 @Zyh_277 的题目,感谢 @喜多鱼 的物资准备
-
出题组预期难度
E<G<K<H<J<D<A<I<B<F<C
-
实际难度
G<E<K<H<D<J<I<B<F<A<C
正文
easy
E:等差数列
每次找到一段连续的最长等差数列 ,假设序列长度为 ,对答案的贡献就是 ,之后继续在 的后面找就行
记得加上长度为 的等差数列
具体细节看代码
G:maximum independent set(easy version)
答案就是小于等于 的素数个数
晒好质数后,做一个前缀和即可直接统计小于等于 的素数个数
medium-easy
K:足球
二分初始容量
分别维护左右箱子的剩余量以及通用的容积,如果对应的箱子还有空余,则直接放入,否则令多出的球占用通用的容积即可
通用的容积在每次放入球之前加一
时间复杂度:
H: maximum independent set(hard version)
诈骗题
首先证明 个数字为何不能选取 个数字
把每个数字都分解为 的形式,其中 是奇数,这样 个数字可以分为 组,每组数字只能选取一个,根据鸽笼原理,最多选取 个数字
其次构造大小 的集合
直接输出 即可
J:ptsd
数据结构优化 的板子
令 表示选取子序列中最后一个数字为
枚举 ,然后更新
值域线段树维护即可
D:相对分子质量
是一道给 写不动其他题 或者 卡某个签到题 的选手拉回差距的题目
但是看起来卡住了一些人()
medium
I: maximum independent set(extremely hard version)
选取较大的数只有可能与一个数的和是 的幂次,但是选取较小的数可能影响更多,所以需要贪心的选取较大的数字
考虑对于一个区间 ,找到最大的 ,如果区间 数字全选,那么区间 中间的数字全不选(会与选择的数字的和组成 )
之后考虑区间 的子问题即可
时间复杂度:
B:中位数(easy version)
考虑最后一定只剩下一个数字 是满足条件的
令小于这个数字的数变为 ,大于这个数字的数变为 ,做前缀和,记前缀和数组为
设这个数字位置为 ,最优方案下,第一次一定是找到 左端的第一个 和右端的第一个 ,有 ,然后对区间 进行操作
之后每次操作,向左移动一次 或者向右移动一次 ,每次移动的要求是保证
假设有 个 使得 且 ,有 个 使得 且 ,总操作次数就是 ,方案数为
需要特殊考虑 的情况,这时第一次操作可以只使区间变为 或者 ,最多操作数变为 ,方案数为
medium hard
A:匹配
-
,这个数对 取模为
-
,这个数对 取模为 或者
考虑如何取到 式
对于 的剩余类,每个余数 都恰好有两个数字与其对应(),如果选择了其中的一个,一定要保证另外一个不选;如果其中一个不选,一定要保证选择另外一个
拿一组数据举例子
3
1 5
2 3
6 4
其中令 为一组, 为一组, 为一组
首先选取 , 不能选,强制选取 , 不能选,强制选取 , 不能选,强制选取
会发现,这种关系一定会形成一个环
这样子一直遍历下去,一定能保证每组数字恰好选取了一个
如果现在选取的数字和是 的倍数,直接输出答案即可;如果不是 的倍数,那么每一组交换选取的数字即可(根据题解开篇的等式可推出)
时间复杂度:
F: multiply
注意到我们并不关心最后一个子序列具体乘积是多少,只关心这个子序列乘积是否 。
所以我们设计状态为 表示当前考虑到了 ,子序列乘积需要 才能 的方案数和权值。
此时对于 的子序列乘积,他们都会等于 ,因为此时表示子序列乘积 ,即子序列乘积已经大于等于 。
而剩下的可能状态其实就是对每个 ,都有 ,注意到这是一个整除分块的形式,经典结论可知只会有 级别的不同的数,单独处理之后,每次枚举这些状态和当前的值 ,刷表转移即可,转移方程看具体代码
时间复杂度:
其实这题的预期是 难度,但是不少精通 的选手切的很快哇
hard
猫猫头说不清,所以
@Zyh_277 催更
(这位鸽鸽在准备下周的 港澳,大家不要催他了,为他加油!!!)