首页 > 其他分享 >P4338 历史笔记

P4338 历史笔记

时间:2024-01-25 17:12:45浏览次数:25  
标签:历史 颜色 个点 sum 笔记 fa P4338 重边 轻边

神题啊!神题(赞叹)

题意

形式化题意:

给定一棵 \(n\) 个点的树,第 \(i\) 个点有点权 \(a_i\)。且每个点都有颜色,初始时颜色都为 \(1\),第 \(i\) 个点的颜色是 \(c_i\)。

你可以对一个点 \(x\) 进行一次操作:

  1. 计数有多少 \(v\),满足 \(v\) 在 \(x \to 1\) 的路径(包含 \(x\) 和 \(1\))上,且 \(c_v \ne x\)。
    将满足条件的 \(v\) 的个数记作 \(cnt\),并使 \(ans := ans + cnt\),初始时 \(ans = 0\)。
  2. 将 \(x \to 1\) 路径上的点颜色全部变为 \(x\)。

现在知道了第 \(i\) 个点总共被操作 \(a_i\) 次,问如何安排 \(\sum a\) 次操作,使最后 \(ans\) 最大。然后还有 \(m\) 个询问,每次如下:

  • x w 表示将 \(a_x := a_x + w\) 后的答案。

题解

第一步就是一个比较难的性质的观察:每个点对答案的贡献是相互独立的。这里每个点对答案的贡献是指,它被其它点当做不同颜色计数,被算了几次。

有了这个观察后,可以分别对每个点 \(x\) 算出答案。具体的方法为,假设现在有一个序列 \(b\),长度为 \(k\)($k = $ \(x\) 的子树大小),有 \(c_1\) 个 \(b_1\),\(c_2\) 个 \(b_2\),\(\cdots\),\(c_k\) 个 \(b_k\)。
这里序列 \(b\) 就是 \(x\) 子树点集,\(c_{x} = a_{b_x}\)。然后等同于安排 \(b\) 的顺序,使得最后长度为 \(\sum c\) 的序列中,相邻的不同颜色的元素最大化。

根据一个类似于摩尔投票法的证明,有一个这样的结论,设 \(T = \sum\limits_{i = 1}^k c_i, M = \max\limits_{i = 1}^k c_i\):答案是 \(\min\{T - 1, 2(T - M)\}\)。

现在转化完了之后,题目变成了求:

\[\sum\limits_{i = 1}^n \min\{T_i - 1, 2(T_i - M_i)\} \]

每次询问 x w 变为对 \(1 \to x\) 链上的点的 \(T_i\) 增加 \(w\),再设法改变一下 \(M_i\),这就是 \(\mathcal{O}(nq)\) 暴力。

到这里获得了整整 \(30\) 分的好成绩。接下来再接再厉,考虑优化这个暴力。

又是一步重要的观察:任意时刻,任何被非 \(1\) 的颜色染色的结点所形成的联通块,一定是一条直上直下的链

这使得 \(M_i\) 所代表的颜色,也一定是一条直上直下的链。

这个性质让我们回想起了树点涂色,提示我们可以用 \(\text{LCT}\) 解决此题。

同样的,根据上面的式子的分界线,我们将每个边归为重边和轻边,定义为:

  • 重边:若 \(2T_i \geqslant T_{fa_i} + 1\),则 \((i, fa_i)\) 为重边。
  • 轻边:不满足该边为重边的边。

由于 \(T_{fa_i} = \sum\limits_{j \in fa_i.\text{son}} T_j\),所以每个点往儿子连的重边显然不会超过 \(1\) 个。

一次 \(a_x := a_x + w\) 影响到的点,一定是 \(x \to 1\) 上的点,考虑讨论重边在操作后的变化。

假设现在正在 access 中,讨论 \((x, fa_x)\) 这条边的轻重:

  • 如果 \((x, fa_x)\) 操作前是重边,那么一定该边仍是重边,可以轻松用糖水不等式证明。
  • 如果 \((x, fa_x)\) 操作前是轻边,那么有可能 \(fa_x\) 的原重边改为 \((x, fa_x)\) 这条边;也有可能 \(fa_x\) 的重边消失,只剩轻边。

综上所述,遇到重边可以直接跳上去,因为这个不会影响答案(\(T_x - M_x\) 不变)。

时间复杂度为跳轻边的次数,类似重链剖分的复杂度分析,单次 access 复杂度是 \(\mathcal{O}(\sum a)\) 的。(每次跳轻链使 \(T_x\) 翻倍)

代码

懒得放。

标签:历史,颜色,个点,sum,笔记,fa,P4338,重边,轻边
From: https://www.cnblogs.com/CTHOOH/p/17987163

相关文章

  • 《Visual Tree Convolutional Neural Network in Image Classification》阅读笔记
    论文标题《VisualTreeConvolutionalNeuralNetworkinImageClassification》图像分类中的视觉树卷积神经网络作者YuntaoLiu、YongDou、RuochunJin和PengQiao来自国防科技大学并行和分布式处理国家实验室初读摘要问题:在图像分类领域,随着深度学习的快速发展,卷......
  • JAVA学习笔记--使用Inte IDEA
    使用IntellijIDEA编写代码新建项目创建新项目选择创建一个空项目并输入项目名弹出ProjecStructure窗口先关闭新建一个模板(Module)并输入模板名打开前面关闭的ProjecStructure窗口修改以下信息(注意:安装的是JDK8则按照以下信息修改,若安装的是JDK其他版本则......
  • JAVA学习笔记--数据类型及注意事项
    Java的数据类型(笔试考题)Java是强类型语言:要求变量使用要严格符合规定,所有变量都必须先定义后才能使用基本类型(primitivetype)数据类型整数类型byte(1字节):-128~127short(2字节):-32768~32767int(4字节):-2147483648~2147483647(最常用)long(8字节):-9223372036854775808~922......
  • JAVA学习笔记--变量与常量
    变量局部变量注意:必须声明并且必须初始化值publicclassHello{//main方法publicstaticvoidmain(String[]args){//局部变量,只在{}内使用inti=10;System.out.print(i);}//其他方法publicvoidadd(){......
  • MySQL学习笔记-d1
    壹·基础篇通用语法及分类DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)DML:数据操作语言,用来对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的记录DCL:数据控制语言,用来创建数据库用户、控制数据库的控制权限DDL:1.1数据库CREATEDATABASE......
  • Cayley-Hamilton 定理学习笔记
    CH定理主要用于优化线性递推。下面很多东西都是自己瞎琢磨的,大概错漏挺多。线代的一些基本知识感觉学习CH困难的很大一部分原因就是缺少一些线代的基础。矩阵的秩\(r(A)<n\),说明向量组线性相关,说明行列式\(|A|=0\)。反之,如果\(|A|\neq0\),那么矩阵满秩。即二者充要。......
  • 拥有自己的本地聊天机器人(不需要ChatGPT、笔记本就行)
    概述Windows下,架构是使用开源项目来搭建起来的。因为苦于ChatGPT需要Key,觉得很麻烦,且还有一些数据隐私的考虑,所以一直在寻找有没有可行的完全本地化的方法,最终还是找到了一个可行的方案。最低的资源要求也不是很高,笔记本就行,如果拥有更好的硬件资源的话(Nvidia显卡),那输出会快很多......
  • P3703 树点涂色笔记
    又是一道妙题,加深了蒟蒻对\(\text{LCT}\)的理解。题意给定一棵\(n\)个节点的有根树,根节点为\(1\)。最开始每个节点都有颜色,且颜色互不相同。定义一条路径的权值为:改路径上点的不同颜色数。现在一共会有\(m\)组询问,每组询问有三种:1x将\(x\)到根节点\(1\)上的所......
  • K8s笔记-使用 Service 把前端连接到后端
    1配置configMap1.1配置cm[root@k8s-master~]#kubectlexec-itnginx-deploy-78d8bf4fd7-2xtd2-ntest--sh-c"cat/etc/nginx/nginx.conf"[root@k8s-master~]#kubectlexec-itnginx-deploy-78d8bf4fd7-2xtd2-ntest--sh-c"cat/usr/share/ngi......
  • Pure Admin 学习笔记(一)
    介绍vue-pure-admin(opensnewwindow)是一款开源免费且开箱即用的中后台管理系统模版。使用纯ESM、Vue3、Element-Plus、Vite、TypeScript、Pinia、TailwindCSS等主流技术栈开发在线预览PureAdmin完整版PureAdmin精简版文档地址PureAdmin保姆级文档快速上手开发环境......