首页 > TAG信息列表 > 树上
P3177 树上染色做题记录
树形 dp 好题。 做这题的思想历程: 定义 \(dp_{i,j}\) 表示以 \(i\) 为根的子树中,选择了 \(j\) 个节点的答案。感觉还要带上一维状态就是所有黑点距离 \(i\) 的距离,这违反了做题思路中间的简洁性的原则。于是我们 查看题解。 经过不明方法之后,我们想到了定义 \(dp_{i,j}\) 对于答案CSP-S2019 树上的数(并查集,dfs)
CSP-S2019 树上的数 \(n\) 树。\(n\) 排列卡片。\(i\) 卡片初始在 \(p_i\)。每次删一条边可以交换两端卡片。删光边最后卡片 \(i\) 位置 \(P_i\)。求字典序最小 \(P\)。 CODE 无可奉告。[NOI2013]快餐店
[NOI2013]快餐店] 传送门 题意分析 n个建筑由n条道路相连,可以得出给出的图实际上就是一棵基环树。 快餐点要设在距最远顾客最近的位置 并且可以设置在道路上,实际上就是找树上最长链中点,也就是树的直径,类似于求树的直径。 解题思路 首先考虑如何将此问题转化为求树的直径多次查询与树上点u距离为k的点,例题
https://atcoder.jp/contests/abc267/tasks/abc267_f 此题目首先有结论:距离树上任意一点距离最远的点,是直径的其中一个端点 https://www.cnblogs.com/ydUESTC/p/16664485.html 故对于一个查询u,k如果存在一个答案,则可以在u到端点L或R的路径中查找到(因为这两条路径已经包含最远路径树上最长路的O(n)算法
关于如何求得树中每个点最长路的O(n)算法: 1.算法流程: 求出树上的直径,在第二次dfs中求出从直径一端点到每个点的距离 再跑一次dfs,求出另一端点到每个点的距离,并更新每个点的最长路 2. 算法实现: #include<bits/stdc++.h> #define ll long long #define N 10000005 #define f1(i,n,codeforces.ml/contest/519/problem/E 求树上到任意两个点距离相等的点 树上倍增 分类讨论
E. A and B and Lecture Rooms time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output A and B are preparing themselves for programming contests. The University where A and B study is a set of room树形dp例题 + 学习笔记(入门版)
树形dp,即在树上进行dp。 需要对树这一数据结构有清晰的了解。其中重点在于树的遍历、子树相关问题。 难点常常在于状态方程的书写。 例题 一、没有上司的舞会 题意 树上每个结点有权值,要求在树上选一些点,满足有父子关系的结点只能出现一个,问选出的最大的权值和。 思路 用 \(dp[i][CF1389G口胡
首先对于一个点双内的点,一定可以将其边定向成一个强联通分量。所以可以将这个图缩点,问题变到了树上。 将这 \(k\) 个点在树上标记出来,我们需要选取一颗原图的子树满足叶子结点必须是这 \(k\) 个点中的点。(差不多就是建个虚树然后把父子边在原图上对应的边拉出来) 定义每个点的权值LCA(树上倍增)
https://www.luogu.com.cn/problem/P3379 链式前向星存边 fa[i][j] 代表从i结点向上找 2^i 代的父亲,(i=0代表真父亲) dfs从根结点开始fa[now][i] = fa[fa[now][i - 1]][i - 1];代表当前结点的第2^i代父节点是当前结点2^(i-1)父节点的2^(i-1)代父节点,然后再对其连接到的非父结点dfAC 自动机
重新学 \(AC\) 自动机发现以前就像没见过一样…… 首先是一段经典的话:“\(AC\) 自动机是 \(trie\) 树上跑 \(kmp\)” 于是 \(AC\) 自动机的关键在于运用 \(nxt\) 进行匹配 由于这时的 \(nxt\) 形成一棵树形结构,可以将一些匹配问题转化为树上问题 如果 \(x\) 匹配到了文本串,那么所树上M乘积路径数
此题是在某个的oj上看到的,题目标题和数据都不记得了,只能说个大概(标题瞎编的) 题目大意 给出\(n\)个点,可以任意选择生成树和\([1,m]\)的边权。由这些点连成一棵树,树中每一条边的权重介于\([1,m]\)给出两点\(a,b\)问有多少种树满足\(a,b\)之间的路径的权值乘积为\(m\) 数据范围 \(n<=树上分治
1. 点分治 现在有一棵大小为 \(n\) 的树,要求出路径长度小于 \(k\) 的路径。 每次可以通过选择重心的方式,将整棵树分为一堆不大于 \(\dfrac{n}{2}\) 的子树,所以将整棵树分为大小为 \(1\) 的子树需要 \(\log n\) 次。 对于现在求出重心的子树,显然有三种情况可以组成一条路径。 路径树上启发式合并
模板 #include <iostream> #include <cstdio> using namespace std; const int N = 100010; int n, c[N], head[N], ver[N << 1], nex[N << 1], tot, cnt[N], num[N], siz[N], son[N], L[N], R[N], dfn, pos[N], maxn; long long sum[N], ans[N]; inlinCF1140G-Double Tree【最短路,矩阵乘法,树上倍增】
正题 题目链接:https://www.luogu.com.cn/problem/CF1140G 题目大意 给出一个\(n\)个点的树\(T\),然后复制一份\(T'\),每个\(T\)中的点\(i\)向\(T'\)中的点\(i\)都有连边构成一张图。 图上所有权值各不相同,现在\(q\)次询问图上两点的最短路。 \(1\leq n\leq 3\times 10^5,1\leq q\l洛谷-P3178 树上操作
树上操作 树链剖分模板 - 子树区间加和 考虑到树链剖分的时候,一颗子树内的 dfn 序一定是连续的一段区间,因此只要找到子树内最大的 dfn 序即可,也就是树链剖分 dfs 的时候回到当前结点时,记录一下当前分配 dfn 序分配到了哪个值 然后直接线段树区间加和即可 #include <iostream> #inc关于树上差分
树上差分有两种形式,一种是自上而下的,通过给子树树根赋值来影响整个子树,获取答案的时候从父亲处获取;一种是自下而上的,通过给某个点和它的某个祖先赋值来影响一条链,获取答案的时候要加上孩子的值。脑残了。树上染色
树上染色 树上背包 + 边贡献 HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int N = 2e3 + 10树上差分 学习笔记
前置知识:差分 例题:P2367 语文成绩 序列维护区间加,最后询问序列最小值。 线段树 差分即可。 对于在原数列 \(a_u\) 到 \(a_v\) 都加一个 \(x\),考虑在差分数组 \(b\) 中,变化的只有 \(b_u\) 和 \(b_{v+1}\)。 因为在原数列 \(a_u\) 到 \(a_v\) 都加一个 \(x\),对于 \(u\) 之前和 \(树上差分
差分数组 我们令\(a[i]\)表示原数组 \(dif[i]\)表示差分数组 那么我们就有 \[\left\{ \begin{aligned} dif[0]&=a[0]\\ dif[i]&=a[i]-a[i-1],i>0 \end{aligned} \right. \]那么\(a[i]=\sum_{k=0}^idif[k]\) a[i] 4 6 4 3 6 dif[i] 4 2 -2 -1 -3 假设我们要将a[i]到a[k]树上差分
本篇随笔简单讲解一下信息学奥林匹克竞赛中树上差分的相关知识点。树上差分近几年成为了考试热门,也成为了考察差分思想比较常用的手段。理解树上差分最好需要读者了解图和树的基础知识,\(LCA\)及\(LCA\)问题的求法,以及差分数组和差分思想。 一、边的差分 我们对差分和差分数组的理轻重链剖分学习笔记
这是第二遍 \(dfs\),定义:\(son[now]\) 为 \(now\) 点的重儿子,\(topf\) 为当前的重链上深度最小的一个点也就是开始的点。我们在遍历整棵树的时候,会选择先去遍历这个点的左儿子然后再去管其他的点。我们在这一遍遍历其实就是在给他们分配线段树上的基本信息以及记录轻重链的基本信D.生活在树上
D.生活在树上 思路:树上\(dp\),\(dp[i][1]\)表示从顶点\(i\)开始,走过的距离为\(1\)的经过的结点数,\(dp[i][2]\)表示从顶点\(i\)开始走过的距离为\(2\)经过的结点数。 初始化:统计一下每个结点周围的距离为\(1,2\)结点个数即可。 状态转移:\(if(dis == 1) dp[i][2] += dp[x][1] - 1\)luogu P2664 树上游戏
题面传送门 这种数颜色的东西考虑颜色分开考虑。 如果我们将这些颜色对应的点删去,那么对于每个点对应的联通块大小\(siz\),这个颜色对这个点的贡献就是\(n-siz\) 所以我们需要算的就是每个点的联通块大小。 可以记\(P_i\)为\(i\)的父亲对应的颜色中在\(i\)子树内且与\(i\)间没有其树的直径教学思路
树的直径教学思路 首先根据树的直径的性质,即它为树上两个最远点的距离,推出求解找出直径的两种方法.1:两次遍历法.适用条件:树上的边权必须为正,如果边权为负则不再适用2:最长链加次长链适用条件:边权可正可负,相较上一种方法,它可求解出关于子树更多的信息,例如求树上所有点,均树上路径求交
对于路径 \((u,v)\) 和 \((s,t)\) 判断是否有交: 对于两点 \(\operatorname{LCA}\) 的深度较大者,判断它是否在另一条路径上 求交出来的路径 \(\operatorname{LCA}(u,s),\operatorname{LCA}(u,t),\operatorname{LCA}(v,s),\operatorname{LCA}(v,t)\) 四者中,深度较大的两个即为