树形DP: DP巧妙之处在于状态设计,即将多个类似信息放在一起 考虑,这也是DP的最优子结构性质,而树形DP常以记录根 节点信息进行转移,因为通常以根节点子树为DP阶段,而仅 有根节点信息会阶段外信息造成影响。 例1:选课 传统树形背包,利用树的递归性质,即子树(子集合) 之间的独立性分而治之,时间 ...
转载 2021-08-03 06:58:00
76阅读
2评论
先发出来,防止后期咕掉 树链剖分 重链剖分 \(\;\) 从每个点到根的路径上至多会有$log(n)$条轻边。(每次走轻边子树规模至少除2) 所以对于树上的任意一条路径,从lca处往两边拆分,至多会有$log(n)$条重链 每次都要跳所在所在重链顶端较深的那一个 NOI2021 Day1 T1 \( ...
转载 2021-08-02 16:39:00
90阅读
2评论
链接: https://vjudge.net/problem/HYSBZ 4033 题意: 有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N K个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益
转载 2019-08-22 14:42:00
118阅读
2评论
// luogu judger enable o2 include include include include include include include using namespace std; const int N = 3e5+1e3; int read(){ int q=0;char
原创 2021-07-15 14:17:48
65阅读
喵喵,为什么搜不到关于树上博弈的东西啊(面向百度者的大失败) ...
转载 2021-08-16 20:52:00
355阅读
2评论
树上求和 https://ac.nowcoder.com/acm/problem/19428 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int MOD=23333; #define ll lon ...
转载 2021-10-06 00:00:00
72阅读
2评论
bool check(int x){    int cnt=0,dist=0;    memset(tmp,0,sizeof(tmp));    for(int i=1; i<=m; i++)    {        if(Q[i].Dis > x)        {            tmp[Q[i].s]++;            tmp[Q[i].t]++...
i++
转载 2022-01-10 10:58:26
128阅读
// Problem: 生活在树上// Contest: NowCoder// URL: https://ac.nowcoder.com/acm/contest/11223/
原创 2022-08-16 14:39:18
81阅读
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<vector> #include<queue> #include<s...
原创 2021-07-09 14:07:55
157阅读
斜率优化的时候有的时候可能会出在树上可是我并不会QWQ。 显然一个dp方程是 f[i]=min{f[j]+(d[i]-d[j])*p[i]+q[i]} 我们只需要取到最优决策j即可由于在树上这个复杂度还是n^2的。 考虑优化。 f[i]=f[j]+d[i]*p[i]-d[j]*p[i]+q[i];
转载 2019-05-23 19:59:00
213阅读
2评论
树上倍增. dfs序的做法: 思路: 至于代码……额……没写 树上倍增还能够用来求LCA 其中f[i,j]表示i的第2^j祖先dfs预处理f[i,j]=f[f[i,j-1],j-1]; 对于每一对x,y先将深度调成一样再枚举j逐一往上找,这两个过程都是log的 代码如下: #include <ios
原创 2021-08-03 09:36:53
95阅读
[一二维差分和前缀和](https://www.cnblogs.com/G-H-Y/p/14287618.html)## 算法流程设差分数组为$d[i]$快速修改点a与点b之间的边权```C++d[a] += c;d[b] += c;d[lca(a, b)] -= 2 * c;```以一点作为根节点的子树上的点权和即为连接该点边的修改值eg:设差分数组初始值为0,对于下图,`++ d[3]`,`+
原创 2023-07-12 21:42:31
54阅读
树上求和(DFS)传送门思路:计算每条边的贡献次数,然后排序即可。每条边贡献次数公式:cnt=size[u]×(n−size[u])cnt=size[u]\times (n-size[u])cnt=size[u]×(n−size[u])#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5;#define mst(a) memset(a,0,sizeof a)#defin
原创 2022-01-22 13:45:08
55阅读
LCA就是最近公共祖先,比如 节点10和11的LCA就是8,9和3的LCA就是3。 我们这里讲一下用树上倍增来求LCA。 大家都可以写出暴力解法,两个节点依次一步一步往上爬,直到爬到了相同的一个节点。 二树上倍增就是对暴力的优化,改成了一次爬好几步。 具体怎么爬呢?就是两个点每次爬 2^j 步,而
原创 2021-05-29 18:32:33
272阅读
B: 树上分支   内存限制:128 MB时间限制:1 S标准输入输出     题目描述 有的时候,题目和内容是没有一点关系的。当然,作为一个有责任心的出题者,会把题目和名字紧紧联系在一起。显然,小花不是一个有责任心的出题者。由于他想尽早的完成出题任务,于是他把出题的流程抽象成了一棵树。例如,当出完题目后,小花可以选择先写标程,或是先造数据。但找人验题,一定是在造完数据以后。他现在正处在其中的某个
转载 2021-06-11 13:31:39
55阅读
树上求和(DFS)传送门思路:计算每条边的贡献次数,然后排序即可。每条边贡献次数公式:cnt=size[u]×(n−size[u])cnt=size[u]\times (n-size[u])cnt=size[u]×(n−size[u])#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5;#define mst(a) memset(a,0,sizeof a)#defin
原创 2021-08-10 10:08:09
95阅读
知识点总结。 判断树上的链 ···每个点的度数不超过二(出度与入度之和) 判断树 ···n个点,只有n-1条边 ···每两个点之间的边具有唯一性 多叉树转换成二叉树 ···第一个孩子作为左孩子,第一个孩子的兄弟作为它的右孩子 最小生成树 生成:prim or kruskal具体代码在这里 一些小性质 ...
转载 2021-08-15 20:41:00
472阅读
2评论
树上的有些问题是可以用树剖或者动态树解决的,但是他们有一个动同点就是:不连通。 比如求u到v的路径权值和,或者最大值: u到v可能对应了多个链,这多个链在对应的数据结构(假设是线段树)上面对应不同的区间。但是线段树上这几个区间的不连续并不影响我们得到答案。 (当然求子树的信息话是连续区间) 那么如果
转载 2018-01-12 13:27:00
108阅读
2评论
IV.树上游戏 考虑淀粉质。 对于一棵分治树,我们考虑对树中所有LCA为根节点的路径计算贡献。 我们对于根节点一棵子树一棵子树地处理。设$cnt_i$表示子树外有多少条以根节点为一个端点的路径上有颜色\(i\)。则我们当前子树中的一个点的贡献可以分作两部分:子树外的部分(即$\sum cnt_i$)
转载 2021-04-01 12:34:00
68阅读
2评论
差分 算是一种比较重要的操作了,而且 还简单 。 具体的 差分的好处 就是 O(1)时间内完成 区间操作 O(n)时间内得到区间总体答案。 假如不差分的话 那么每次区间操作都是O(n)的 最后 O(1)时间来提取答案。 整个操作是 O(n^2)的 而对于树上的差分操作 也是这样的。 这道题是一道简单
转载 2019-03-22 20:51:00
140阅读
2评论
  • 1
  • 2
  • 3
  • 4
  • 5