NOIP训练赛#12

时间安排

7:50~8:20 写完 T1的暴力,想了一个做法但是假了

8:20~9:50 写完T2 T4的暴力,开始想T2的DP(肝了很长时间,搞了很多种假做法)

9:50~10:15 写完T3暴力

10:20~11:30 检查代码正确性以及想想剩下的几道题(主要还是想T2)

11:30~11:50 罚坐

题解

T1

\(g=\gcd(e_1,e_2\cdots e_m)\) ,则\(\sqrt[g]{x}\in Z\) ,(每个指数都能整除 \(g\) ),故枚举 \(g\) 即可(\(1\leq g\leq \log_2x\))

T2

考虑贪心,若一次去驿站可以取走多个快递,那么肯定优先取截止日期近的,故对于每一个快递都按照 \(l\) 为第一关键字, \(r\) 为第二关键字进行排序

考虑连续的一段快递 \([l_a,r_a],[l_{a+1},r_{a+1}]\cdots [l_b,r_b]\) ,当 \(l_b\leq r_a\)\(b-a+1\leq k\) 时才能被全取走,那么设 \(f_{i,j}\) 表示再 \([i,j]\) 天中不高兴值最小的那一天的不高兴值,则一次性取走 \([a,b]\) 的快递的最小代价为 \(f_{l_b,r_a}\) (因为题目限制,所以不会出现一个大区间包含两个小区间的情况),此时可以暴力枚举每个快递分到那个组里,但时间复杂度 \(2^m\) ,不可接受

考虑动态规划

\(g_i\) 表示拿走排序后前 \(i\) 个快递的最小代价,则 \(g_i=\min(g_{j-1}+f_{l_i,r_j})\) ,时间复杂度 \(m^2\) 可以接受

T3

题解写的挺好的,直接上题解

在某个极大的好子矩阵 \(R\) 内,任意两点之间都可以一步到 达,代价为对应子矩阵内的最小值。 注意到目标是求最小总代价,因此将一步的代价放宽到 “对 应子矩阵内的某个数” 不会改变最优解。 枚举 \(R\) 内每个格子 \((i, j)\),将 \(R\) 按照 \((i, j)\) 为原点分为左上、 右上、左下、右下四个区域。 容易发现每个区域内的所有格子都能以 \(a_{i,j}\) 的代价一步跳到 对角区域内的所有格子

对于这 \(4\) 个区域各建立 \(2\) 个虚点,分别表示 “进入” 和 “出 去”,那么由 “出去” 点向 “进入” 点连边权为 ai,j 的边即可。 最后得到一张点数边数均为 \(O(n^2)\) 的图,堆优化 \(Dijkstra\)\(O(n^2logn)\) 时间内求出最短路即可

T4

考虑原问题转换为从区间 \(l,r\) 中选出若干个数使得它们的和为 \(m\) ,可以用 \(01\) 背包来做

考虑如何优化复杂度:

引入 :背包的操作:

往背包添加一个体积为 \(v\) 的物品:

for (i = m; i >= v; i--) s[i] += s[i - v];

往背包里删除一个体积为 \(v\) 的物品:

for (i = v; i <= m; i++) s[i] -= s[i - v];

时间复杂度均为 \(O(m)\)

\(f_i\) 表示往空背包里添加前 \(i\) 个物品的背包数组

\(g_i\) 表示往空背包里删除前 i 个物品的背包数组

注意到插入和删除的顺序可以颠倒,故直接将 \(g_{i-1}\)\(f_r\) 合并即可

原因:考虑在一个背包中 \((f)\) 添加"反物品" \((g)\) ,即可达到去掉不合法数字的效果

猫树做法:

考虑将询问离线的存下来,然后可以在建猫树的过程当中遍历询问,如果合法则直接将背包 \(l\sim mid\) 和背包 \(mid\sim r\) 合并即可

posted @ 2023-09-23 19:21  dubnium  阅读(24)  评论(0)    收藏  举报