训练回顾
训练试题:2020牛客暑期多校第九场
训练时间:2020年10月5日 8:00-12:30
训练人员:F,Y
训练模式:正常(一机)
前期题过得太慢了,看到高精度两题很犹豫,犹豫了半个多小时才开始写。双指针题想复杂了,弄了个 T 飞的数据结构做法。总体上反映的问题是手生(频繁出现低级错误,除0等等),或许再练几场后会有所改善吧。
补题摘要
F
https://www.cnblogs.com/mollnn/p/13769867.html
有 (n) 种物品,每种物品有若干个,每个物品有自己的权值。要选出 (m) 种物品各 (1) 个使得其权值极差最小。
对 ((id,val)) 按 (val) 排序后,双指针即可,保证扫描区间内始终至少有 (m) 种物品即可。
B
https://www.cnblogs.com/mollnn/p/13770240.html
有一棵 (n) 个点的树,从 (1) 号点出发,经过一条边的时候会减少一定的 HP,每条边最多只能经过两次。首次到达某个点 (i) 会增加 (a[i]) 点 HP。求初始 HP 至少为多少才能保证存在一种能遍历所有点并回到原点的方案且整个过程中的 HP 非负。
不妨设访问 (i) 的子树的代价总和为 (s[i]),设访问 (i) 的子树过程中可能出现的最小 HP 的最大值(可能是负数)为 (f[i]),则转移时需要枚举访问各个子树的顺序。
考虑引入临项交换排序的思想,对于 (i,j=i+1),如果 (i o j) 比 (j o i) 优,那么一定有 (min(f_j, s_j+f_i) = min (f_i,s_i+f_j))。
为了能分离出排序使用的关键字,暴力展开上式,发现可以将所有孩子分成 (A={i | i ge 0}, B=E-A) 两部分,那么显然对于 (a in A,b in B),(a o b) 是更优的,于是只需要考虑 (A,B) 各自内部的顺序。根据展开结果容易得出,(A) 内需要 (f_i > f_j),(B) 内需要 (s_i - f_i > s_j - f_j)。实际实现时可以放在一起处理。
J
https://www.cnblogs.com/mollnn/p/13770920.html
给定一个 (01) 矩阵,求其中有多少个连续子矩阵,满足边界(指最外面 (1) 层)都是 (1),中间的 (01) 个数相差不超过 (1)。(n,m le 500)。
预处理出二维前缀和((0) 当 (-1) 计)后,考虑暴力枚举上下边界,考虑夹出的这一部分。我们需要找到上下边界全是 (1) 的连续区间,考虑这些区间中全是 (1) 的列,对这些列用桶维护其前缀和,每次遇到一个合法列时,检查桶中前缀和相差为 (-1,0,1) 的个数,并将自己加入桶中。时间复杂度 (O(n^3))。
C
还没完全弄懂,先咕