集训总结(七)

9.18

P10516 数据结构

势能分析线段树。

可以发现若无操作二且 \(t \ne 0\)\(t=0\) 直接特判就好了)时,有效的操作一至多进行 \(\sqrt{n}\) 次,所以我们可以直接对操作一暴力修改。对于操作一,我们记录区间最小值,判断区间最小值是否 \(\le k\),若是,则向下递归到叶子后修改。可以发现这样复杂度是正确的。

考虑操作二的影响。由于操作二是单点修改,所以至多影响 \(O(n)\) 个数,也就是至多使操作一的次数增加 \(n \sqrt{n}\) 次,可以发现此时先前的操作复杂度仍是正确的。

最终复杂度 \(O(n \sqrt{n}logn)\) 但跑不满。

记得特判 \(t=0\) 的情况。

9.19

P3988 发牌

不理解为什么是紫。

显然有每次发的牌 = (牌顶数 + \(R_i\) )% 剩余牌数。

然后这就是一个权值线段树板子了。

P2839 middle

看到使中位数最大,考虑二分答案。

对于整个序列,设当前二分值为 \(k\),将序列中所有小于 \(k\) 的值赋为 \(-1\),其余赋为 \(1\),对左区间求最大后缀和,右区间求最大后缀和,中间求区间和,判断最后的值是否大于等于 \(0\) 即可。

线段树复杂度不对,要用主席树。

9.20

初赛考得一坨,预估 86.5pts。

P11317 paths

先考虑弱化版,即只考虑某个点的 \(f\) 值。这很简单,长剖求前 \(k\) 大即可。

考虑从 \(u\) 点转移到 \(v\) 点会产生什么影响。可以发现,每次转移会把 \(u\) 子树内的最长链长度减去 \(dis(u,v)\),并将 \(u\) 子树外的最长链长度加上 \(dis(u,v)\)。此时问题转化为了动态插入删除和求第 \(k\) 大,对顶堆或 \(multiset\) 维护即可。

AT_joisc2019_e ふたつの料理

神必上位紫。

发现一个很重要的性质:由于在完成第 \(i\) 个任务前,必须完成前 \(i-1\) 个任务,所以对于某个点,他能产生贡献的时间 \(tim_i\) 是固定的,这显然可以预处理。考虑转化为路径问题。

将问题转化为从点 \((0,0)\) 走到点 \((n,m)\) 产生贡献的最大值, \(A\) 系列任务能产生贡献当且仅当 \((i,tim_i)\) 在路径上方,\(B\) 系列任务能产生贡献当且仅当 \((tim_j,j)\) 在路径下方。但此时两种任务在路径两侧,这很难维护,考虑转换。

我们默认初始获得 \(A\) 任务的所有贡献,此时就能将 \(A\) 任务转化为点 \((i,tim_i)\) 在路径下方时产生负的贡献,此时两种任务都在路径同一侧了。

考虑 \(dp\)。转移式子也很好写:\(f_{i,j}=max(f_{i,j-1},f_{i-1,j}+s_{i-1,j})\)\(s_{i,j}\) 为点 \((i,j)\) 的贡献。此时相当于前缀 \(max\),后缀加。我们将 \(dp\) 数组差分一下,变为单点加,\(map\) 维护即可。

记得要对 \(f\) 值先加后减。

posted @ 2025-09-19 10:47  leizepromax  阅读(13)  评论(0)    收藏  举报