首页 > 其他分享 >7.24 树上问题2笔记

7.24 树上问题2笔记

时间:2023-07-25 21:48:52浏览次数:47  
标签:last 7.24 笔记 括号 为根 题目 line 树上 节点

题单

T1

题目
• 有一棵点数为 \(n\) 的树。
• 有 \(q\) 次询问,每次询问有多少个点到 \(a, b\) 距离相等。
• \(1 ≤ n\), \(q ≤ 500000\)。

Solution

• 设询问 \(a, b\) 两点直接的路长度为 \(d\)。
• 如果 \(d\) 为奇数,那么无解,\(d\) 为偶数有解。
• 考虑以下几种情况:

  1. \(a, b\) 到 \(LCA(a, b)\) 的距离相等,那么 \(LCA(a, b)\) 中除了包含 \(a, b\) 的两棵子树上的点,其他点都满足。
  2. \(a, b\) 到 \(LCA(a, b)\) 的距离不相等,假设 \(a\) 到 \(LCA(a, b)\) 距离更远,则中点到 \(a, b\) 的距离为 \(\frac {d}{2}\)。从 \(a\) 为起点往上走 \(\frac {d}{2}\) 的距离,设该点为 \(c\),那么 \(c\) 为根的子树,除了 \(a\) 所在的子树,其他点都可以作为中点。

• 时间复杂度为 \(\mathcal {O}(q log n)\)。

T2

题目

• 给你一个以 \(1\) 为根的有根树。
• 每回询问 \(k\) 个节点,\(v_2, v_2, \cdots v_k\)。
• 求出是否有一条以根节点为一端的链使得询问的每个节点到此链的距离均 \(≤ 1\)。
• 只需输出可行性, 无需输出方案。
• \(n, k, \sum k ≤ 200000\)。

Solution

• 如果要经过一个节点,会有三种情况:

  1. 经过它的父亲。
  2. 经过它本身。
  3. 经过它的两个及以上的儿子(这样才能覆盖节点)。

• 但是题目给的是一个有根树,所以要想经过一个节点或者它的儿子就必须经过它的父亲,所以题目就变成了让我们满足链经过给出节点的父亲节点。
• 我们可以按照深度从小到大排序后,依次判断相邻两个点中深度大的是否在深度小的子树内即可,可以用 \(dfn\) \(\mathcal{O}(1)\) 判断。

T3

题目

blog

T4

题目
• 给一棵 \(n\) 个节点的树,每个点为黑色或白色,一次操作可以使一个相同颜色的连通块变成另一种颜色,求使整棵树变成一种颜色的最少操作数。
• \(n ≤ 200000\)。

Solution

• 神仙题。。。
• 遍历所有的边,如果边的两端颜色不一样,那么就将这条边权置成 \(1\),最后求树的直径即可。就这么简单。。。

T5

题目
• 有一棵点数为 \(n\) 的树,以点 \(1\) 为根。
• 有 \(m\) 个操作,分为两种:

  1. \(1\) \(x\) \(a\):将 \(x\) 为根的子树涂上 \(a\) 号颜色 (颜色不会覆盖,全部共存)
  2. \(2\) \(x\):询问 \(x\) 为根的子树颜色丰富度,表示为所有子树节点颜色种类数相加 (每个点单独计算)
    • \(n, m ≤ 100000\)。

Solution

• 码量巨大的sb题。
• 可以利用时间戳的性质(同个子树内节点编号是连起来的)写线段树。
• 然后维护一个 \(set\),存储每种颜色哪些点染上了。但是点太多了,直接存储肯定是不行的,然后就可以发现:

  1. 如果点 \(x\) 要染上颜色 \(x\),那么他在 \(set\) 里的子孙就可以删除了,这点可以暴力实现。
  2. 然后如果点 \(x\) 要染上 \(c\),且发现他的祖先已经在 \(set\) 中,就是染过了,那么这次修改就可以忽略了。

T6

题目
• 给定 \(n\) 个节点的树,\(1\) 为根节点,每个节点是一个 ‘(’ 或者 ‘)’。
• \(1\) 到每一个节点 \(x\) 的路径是一个括号序列,记括号序列中子串是合法括号序列的数量为 \(k_x\)。
• 计算出 \((1 \cdot k_1)⊕(2 \cdot k_2)⊕· · ·⊕(n \cdot k_n)\)。
• \(n ≤ 500000\)。

Solution

贺的题解
• 首先表示状态。
• \(f_i\) 表示 \(i\) 这个节点到根节点的合法括号序列数。
• \(last_i\) 表示 \(i\) 到根上一个没有匹配的 ')' 的位置。
• \(line_i\) 表示 \(i\) 到根的路径上连续已经匹配的括号串数。
• 考虑转移。
• 如果这个节点是 '(',那么 \(f_i\) 以及 \(line_i\) 都是直接继承父节点的,所以 \(last_i\) 就是 \(i\)。
• 如果是 ')',但 \(last_i\) 不存在,这个括号就无效了。
• 如果是 ')',且 \(last_i\) 存在,那么就有以下转移:

  1. \(last[u] = last[fa[last[u]]]\),也就是说 \(u\) 和 \(last[u]\) 匹配之后上一个没有匹配的就是 \(last[fa[last[u]]]\)。
  2. \(line[u]=line[fa[last[u]]]+1\),也就是说连续的括号数是 \(fa[last[u]]\) 的连续括号数加 \(1\)。
  3. \(f[u]=f[fa[u]]+line[u]\),这里匹配了之后,会形成 \(line[u]\) 个新的合法串。

• 遍历一遍即可。

标签:last,7.24,笔记,括号,为根,题目,line,树上,节点
From: https://www.cnblogs.com/User90174/p/17581106.html

相关文章

  • 7.23 树上问题笔记
    题单由于题目过多,只放几道重要的。。。T1题目•A国有\(n\)座城市,编号从\(1\)到\(n\),城市之间有\(m\)条双向道路。每一条道路对车辆都有重量限制\(z\),简称限重。•现在有\(q\)辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。......
  • 【学习笔记】无向图的连通性
    #割点**定义:**在无向图连通图中,若把点$x$删去后整个图就不连通了,则$x$为割点(割顶)。**朴素方法:**每次删去一个点,然后判断图是否连通,时间复杂度为$O(n(n+m))$。**Tarjan算法:**$dfn_x$:$x$被`dfs`到的时间戳$low_x$:在$x$及以后被搜索的所有节点的$low$值和这些节......
  • 笔记-交易圣经
    笔记-交易圣经通用原则一:思想准备最大逆境:没有最坏,只有更坏情绪指向:目标与期望失利:失败是必然随机市场:不确定性,不可预测性输得起才会赢:生存是第一要义风险管理:如上交易伙伴:防止自欺欺人财务边界:闲钱通用原则二:启蒙避免爆仓风险:有可能即是迟早会发生。没有杠杆减......
  • Numpy学习笔记之Numpy练习
    练习1:分别按照要求,生成一个一维数组、二维数组,并且查看其shapea1=np.array([1,2,'a','hello',[1,2,3],{'one':100,'two':200}])a2=np.array([list(range(6)),list('abcdef'),[True,False,True,False,True,True]])print(a1,'......
  • 2023长郡集训 动态规划笔记
    动态规划原理何为动态规划?动态规划(\(\text{Dynamicprogramming}\)),简称DP。DP并不是一种算法,与模拟、贪心一样,而是一种解决问题的方式。DP的基本思想为「将给定的问题拆分为一个个规模更小的子问题,直到子问题可以直接解决,返回/保存这个值,再根据方程一步步推出原本问题的答......
  • python教程 入门学习笔记 第1天
    初识python一、python语言简介:1、起源:1989年由荷兰的前谷歌程序员吉多.范罗苏姆(龟叔)创造,python的命名来源于英国电视喜剧MontyPython’sFlyingCircus飞行马戏团2、优势:python、Java、c这几种是世界最流行语言;用途广泛,被称为万能语言;语法简洁,上手简单;例如:print("hellowor......
  • typescripts学习笔记(三)
    typescripts学习笔记(三)-实现过程引言Typescript是一种由微软开发的开源编程语言,它是JavaScript的超集,可以在任何支持JavaScript的环境中运行。本篇文章将教你如何使用Typescript来创建一个简单的学习笔记应用。整体流程下面是整个实现过程的流程图:步骤描述步骤1......
  • [c/c++][考研复习笔记]内部排序篇学习笔记
    考研排序复习笔记插入排序#include<stdio.h>#include<stdlib.h>#defineMaxSize9//折半插入排序voidZBInsertSort(intA[],intn){ inti,j,high,low,mid; for(i=2;i<=n;i++){ A[0]=A[i]; low=1;high=i-1; while(low<=high){ mid=(low+high)/2......
  • Numpy学习笔记
    一、Numpy基础数据结构NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成:①实际的数据②描述这些数据的元数据二、常见方法importnumpyasnpar=np.array([[[1,2,3,4,5,6,7],[1,2,3,4,5,6,7],[1,2,3,4,5,6,7]],[[1,2,3,4,5,6,7],[1,2,3,4,5,6,7],[1,2,3,4,5,......
  • 手写数字识别代码学习笔记
    图像预处理importtorchvision.transformsastransforms#定义数据预处理步骤【compose->组成】transform=transforms.Compose([transforms.Resize((128,128)),#将图像大小调整为128x128像素transforms.RandomCrop(100),#随机裁剪图像为10......