George_Plover edited 1 年,9 月前
A.四角不同色
容易发现当 或 时一定有解,而且容易构造。
当 时,若要有解,可以粗略判断出 是必要的,否则将会出现两列完全相同,这时必然会有四角同色的子矩阵。
据此可以预估出当 时,若要有解,则 不会很大。据此可以进行搜索或者手推,构造出方案。
最终结论: 且 时一定有解,可以打表或者搜索求解。
B.模后和
首先可以将 两个数列各项对 取模,不影响答案。
然后问题的本质在于在 两个数列之间,构造一个完美匹配,使得匹配的 组 中,满足 的组的数目尽可能少,不妨称这样的组为劣组。反之不满足此条件的称为优组,我们希望优组尽可能多。
因此可以先对两数列排序。假设最优方案中,优组的数目是 ,那么我们一定可以调整方案使得 序列中取最小的 个元素来组成优组,即 。 接下来假设所有在优组中的 序列元素是 ,容易证明 肯定是一种全为优组的分组方案。
因此我们不妨从小到大枚举 ,并且为当前 贪心选取一个最大的 使得 ,直到找不到为止,即可最大化优组的数目。
排序数列可以在取模后用计数排序进行,贪心算法可以用双指针实现,复杂度
C.排头兵
容易发现,第 个士兵作为端点时,形成的区间总是良好的。
如果第 个士兵的位置确定了为 ,那么对于区间 肯定不是良好的,我们就可以把问题分解到 两个子区间了。
因此可以采用朴素的区间dp求解出良好区间最大的数目,并且记录分界点构造方案即可,复杂度 ,对于已有的士兵需要特殊判断和处理。
注意到题目描述里强调了输出格式不允许有行末空格。
D.前缀分割
等价于枚举分割点 ,然后统计 有多少个后缀与 的前缀相匹配,记统计结果数目为 ;然后统计 有多少个前缀和 的前缀相匹配,记统计结果为 。那么最后的答案就是 。
求解 可以对 求KMP然后在 上跑匹配完成。
求解 可以把 与 拼接后求 Z函数 来完成。
复杂度
E. 第K大
首先不妨将随机变量按照上界从小到大排序,于是可以视 为递增序列。
根据Min-Max容斥的第K大拓展,可以得到:
其中 表示集合,在此题中即为随机生成的 个数。 为 的非空子集。
对此我们考虑子集 的 如何求解。
假设,并且 中元素的随机上界分别为
可以用积分求解该期望:
积分项是关于 的 次函数,我们只需要知道每次项的系数,即可在 时间求解积分的值。
接下来,回到原问题,我们不可能枚举所有的 ,但是我们可以用 的方式把 相同的子集归为同一类,并且在动态规划的过程中维护积分各项的系数。
用 表示在下标区间 的随机变量中选择 个随机变量的集合 的积分多项式之和,该状态记录的是多项式各项系数而非积分结果。
最后按照 将值域分为若干个段,用分段积分的方式计算出每部分贡献即可。
复杂度