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\) 合并即可

浙公网安备 33010602011771号