Loading

2023.2.16

CF1775F. Laboratory on Pluto

钦定最长的一横排长度为 \(x\) ,则 \(n\) 个实验室最小外墙为

\[\min_{x=1}^n2 \left( x+\left\lceil \frac{n}{x}\right\rceil\right) \]

可以看做是用边长为 \(a,b\) 的矩形将其框住,要求 \(ab\geq n\)\(a+b\) 最小。显然的一点是 \(a,b\) 一定集中在 \(\sqrt n\) 附近。直接检查一下根号附近的那些数就行。那么接下来的问题就是,已知用边长为 \(a,b\) 框住这 \(n\) 个实验室,求方案数。

开始的想法是枚举最长的一行的位置,然后再两边摆梯形,但是这样 \(\text{dp}\) 的话状态需要记录:当前总和、当前行号、上一行放的个数。时间复杂度不允许。

换个角度来思考:\(n\) 个实验室的方法实际上是边长为 \(a,b\) 的矩形,削去四角的总共 \(ab-n\) 个位置,问方案数。反过来对削去的进行 \(\text{dp}\) 。这个 \(\text{dp}\) 只会进行一次,因此可以通过。具体的,设 \(f_i\) 表示在一个角上削去 \(i\) 个的方案数,转移从小到大枚举行长,完全背包转移即可。四个角的话将 \(\text{dp}\) 完的结果卷四次就行。

对于考虑某个集合不好做时,不妨考虑其补集。

AGC061C - First Come First Serve

将选择 \(\text{A/B}\) 视为 \(01\) 串来考虑,我们要计算的就是多个 \(01\)\(c_1,c_2,...,c_m\) 其排队结果一样。也就是说们对于某些状态某个人选 \(\text{A/B}\) 不影响答案的话,我们应该要钦定其选 \(\text{A}\) 才行。具体的,将 \([A_1,B_i]\) 视为区间,对于第 \(i\) 个人,记 \(L_i\) 为第一个右端点大于 \(A_i\) 的人,\(R_i\) 为第一个左端点大于 \(B_i\) 的人,那么一旦说 \(i\) 任意选不影响答案,那么 \([L_i,R_i)\) 内的人的选法已经确定:前一部分只能选 \(\text{A}\) ,后一部分只能选 \(\text{B}\) 。如果两个数都可以不影响答案,那么其 \([L,R)\) 显然无交。

现在就要考虑容斥的问题,容斥的 \(\text{dp}\) 是容易的,设 \(f_i\) 表示考虑完前 \(i\) 个人之后容斥的结果。如果要让 \(i\) 无所谓的话,转移:

\[f_i=\sum_{j=1}^{R_j<L_i}f_j\cdot 2^{len_i}(-1) \]

不需要无所谓的话直接继承之前的即可。

P2150 [NOI2015] 寿司晚宴

和昨天做的那道卡牌很类似。

对于质数根号分治,小于 \(\sqrt n\) 的称之为小质数,否则为大质数。这样分的目的是:每个大质数的集合无交

做法是套路性的,预处理 \(f_{0,S}\) 数组为只考虑那些最大值质因子不超过 \(\sqrt n\) 的数,选择这些数包含的小质数集合为 \(S\) 的方案数。再对于每个大质数处理出 \(f_{i,S}\) 表示只考虑第 \(i\) 个大质数的倍数,选择的数包含小质数集合为 \(S\) 的方案数。统计答案的记 \(dp_{S1,S2}\) 表示小 \(\text{G}\) 选择的包含小质数集合为 \(S_1\) ,小 \(\text{W}\) 的为 \(S_2\) 的方案数,枚举将大质数集合加到哪边即可。时间复杂度 \(O(n\cdot 2^{8}+200\cdot 2^{16})\)

posted @ 2023-02-16 17:28  _YangZJ  阅读(71)  评论(0)    收藏  举报