首页 > 其他分享 >Kinetic Tournament Tree

Kinetic Tournament Tree

时间:2024-03-22 13:35:41浏览次数:21  
标签:limits max sum Tournament Tree 一次函数 区间 Kinetic 维护

考虑这样一个问题:\(n\) 个一次函数 \(k_i x_i + b_i\),每个一次函数初始有 \(x_i = 0\);区间对 \(x_i\) 加正数 \(x\),区间查询 \(\max\limits_{i = l}^r k_i x_i + b_i\)。

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

区间加就递归到 \(t \ge x\) 的子树然后打标记。给一次函数的 \(b_i\) 加上 \(k_i x\),阈值减少 \(x\) 即可。

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

1. P5693 EI 的第六分块

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

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

2. CF1178G The Awesomest Vertex

我们记 \(A_u = \sum\limits_{v \in R(u)} a_v, B_u = \sum\limits_{v \in R(u)} b_v\),然后把子树拍平到序列。问题变为:

  1. 区间对 \(A_i\) 加正数
  2. 求 \(\max\limits_{i = l}^r |A_i| \times |B_u|\)

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

3. CF1830F The Third Grace

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

有 \(f_j = \max f_i + c_{i, j} p_i\),其中 \(c_{i, j}\) 为 \(l \le i \le r < j\) 的区间数量。

考虑扫描线,扫右端点,同时 KTT 维护 \(f_i + c_{i, j} p_i\),当 \(j \to j + 1\) 时把所有 \(r = j\) 的区间的 \([l, r]\) 的值加上 \(p_i\)。还要支持把单点修改成 \(f_i\)。套板子即可。

挺抽象的,\(O(n \log^3 n)\) 过 \(10^6\)。

标签:limits,max,sum,Tournament,Tree,一次函数,区间,Kinetic,维护
From: https://www.cnblogs.com/zltzlt-blog/p/18089260

相关文章

  • C. Anji's Binary Tree
    网站:https://codeforces.com/problemset/problem/1900/C这里比较容易搞混的就是各个节点的关系,不要用2*n来表示左孩子!!以及记得添加快读快写ios::sync_with_stdio(false);cin.tie(nullptr);加在intmain()里即可这里还有一个priority_queue的小技巧:结构体内部定义运算符,好像和......
  • npm 错误,ERESOLVE unable to resolve dependency tree 解决方案
    参考:https://blog.csdn.net/qq_42055933/article/details/132098617 背景:当在使用npminstall时遇到“ERESOLVEunabletoresolvedependencytree”错误时,这通常是由于项目的依赖关系发生了冲突或不兼容问题。 方案一:在命令中增加 --legacy-peer-dep 选项或者--force......
  • vue2/3 - element组件库el-tree树形控件实现一键全选/一键反选取消/全部收起/全部折叠
    效果图在vue2、vue3|element饿了么组件库中,详细使用el-tree树状组件完成功能按钮组,支持全部选中节点、反选取消节点、对所有树节点进行折叠收起、是否上下级联动等等!提供详细示例代码教程,一键复制开箱即用~~示例代码请看下方代码及技术点介绍。<template><div......
  • Tree Compass Codeforces Round 934 (Div. 2) 1944E
    Problem-E-Codeforces题目大意:有一棵n个点的树,初始状态下所有点都是白色的,每次操作可以选择一个点u和一个距离dis,使得距离点u所有长度为dis的点变为黑色,问最少需要多少次操作能使所有点变成黑色,输出所有操作1<=n<=2000思路:要想操作数最少,就要使每次操作涂黑的点的数量尽......
  • LeetCode 2265. Count Nodes Equal to Average of Subtree
    原题链接在这里:https://leetcode.com/problems/count-nodes-equal-to-average-of-subtree/description/题目:Giventhe root ofabinarytree,return thenumberofnodeswherethevalueofthenodeisequaltothe average ofthevaluesinits subtree.Note:Th......
  • 集合系列(五) -TreeMap详解
    一、摘要在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。本文主要从数据结构和算法层面,探讨TreeMap的实现。二、简介JavaTreeMap实现了SortedMap接口,也就是说会按照key的大......
  • LeetCode 1161. Maximum Level Sum of a Binary Tree
    原题链接在这里:https://leetcode.com/problems/maximum-level-sum-of-a-binary-tree/description/题目:Giventhe root ofabinarytree,thelevelofitsrootis 1,thelevelofitschildrenis 2,andsoon.Returnthe smallest level x suchthatthesumofa......
  • CF1943C - Tree Compass | 树的直径 思维
    links给定一棵\(n\)个点的树,可以执行任意次以下操作:选定一个距离\(u\),并将与\(u\)距离为\(d\)的点都染色。求使得所有节点都染上颜色的最小操作次数,并输出方案。\(n\leq2000\)看着数据范围,朝着\(O(n^2)\)的dp去想,但是没有想出来。然后又尝试大胆猜测,\(d\)只......
  • git worktree学习
    转自:https://blog.csdn.net/qq_35067322/article/details/1215514691.介绍当在一个仓储下,在A分支编译时,是不能切到B分支上工作的,只能等着A编译完成,很影响效率。所以可以使用worktree命令新建一个工作分支。步骤1:在A分支上编译中,使用以下命令新建一个目录。gitworktreeadd.......
  • 数据结构之BTree、B+Tree的含义及区别
    原文链接:https://blog.csdn.net/weixin_43407520/article/details/1142404381.引言前面学习索引时,了解到MySQL索引的数据类型有B+Tree索引和哈希索引,本文将详细介绍一下BTree和B+Tree的含义和他们的区别。2.BTree2.1概念B树是一种自平衡树数据结构,它维护有序数据并允许以对数时......