Kinetic Tournament Tree

考虑这样一个问题:n 个一次函数 kixi+bi,每个一次函数初始有 xi=0;区间对 xi 加正数 x,区间查询 maxi=lrkixi+bi

考虑每个点维护当 xi=0 时值最大的函数,然后额外维护一个阈值 t,表示当 x 增大到 t 时这个点的子树中至少有一个的最大函数会发生改变。这个是很好维护的,pushup 的时候对两边儿子的 t 取个 min,然后再算儿子的最大函数的交点横坐标(下取整)即可。

区间加就递归到 tx 的子树然后打标记。给一次函数的 bi 加上 kix,阈值减少 x 即可。

正确性比较显然。复杂度经过势能分析是 O(nlog3n) 级别的,但是实际运行跑得很不满。

1. P5693 EI 的第六分块

考虑沿用最大子段和的线段树维护方法,即一个点维护 (pmx,smx,ans,sum)

我们把它们都看成是一次函数,然后修改阈值 t 的定义为子树内的所有这些信息的最大函数第一次发生变化的最小需要加的 x。然后套 KTT 板子即可。

2. CF1178G The Awesomest Vertex

我们记 Au=vR(u)av,Bu=vR(u)bv,然后把子树拍平到序列。问题变为:

  1. 区间对 Ai 加正数
  2. maxi=lr|Ai|×|Bu|

|Bu| 是固定的,所以可以预先取绝对值。考虑 |x|=max(x,x),所以开两棵 KTT 维护即可(一个的 biBi 另一个是 Bi)。

3. CF1830F The Third Grace

考虑 dp,设 fi 为选第 i 个点的最大得分。这里为了方便,把第 i 个点的贡献放到往右边转移的时候再计算。

fj=maxfi+ci,jpi,其中 ci,jlir<j 的区间数量。

考虑扫描线,扫右端点,同时 KTT 维护 fi+ci,jpi,当 jj+1 时把所有 r=j 的区间的 [l,r] 的值加上 pi。还要支持把单点修改成 fi。套板子即可。

挺抽象的,O(nlog3n)106

4. CF573E Bear and Bowling

考虑一个贪心:每次选对答案增量最大的元素,在这个过程中的最大权值即为答案。

考虑动态维护选择第 i 个元素后答案的增量 fi。相当于若选了 p,则 i[1,p1],fifi+api[p+1,n],fifi+aifp

容易看出这是 fi=kixi+bi 的形式,套 KTT 板子即可。区间加 bi 直接打标记就行。

5. P9288 [ROI 2018] Innophone

我们可以强制让 a,b 必须顶到某一个 xi,yi,容易发现这样不会使答案变劣。

考虑枚举 a 然后扫描线,维护有哪些元素不满足第一个条件,KTT 维护 b 取每个值的权值和,那么贡献就是形如区间加 ki

6. CF436F Banners

扫描线,需要区间加等差数列,求全局最大值。容易使用 KTT 维护。

posted @   zltzlt  阅读(248)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示