BZOJ1912 最长链树形DP】的更多相关文章

每次求出最长链更新答案后要将最长链上的边权改为-1 写的贼长 还可以优化... /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_back using namespace std; typedef long long ll; typedef unsigned long long ull; using namespace std; , MAXM = 2e5 + ; ],…
loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数. 注意断句QwQ,是x的/约数和/y,不是x的约数/和/y Sol 先预处理出每个数的约数和,将可以转换的数连边 可将数x的约数和y看成x的父结点,将以x为约数和的数看成x的子结点,这显然是一棵树 题目也就转换成了求这棵数的最长链 对于结点x,只要维护 在以之为根的树内 一端为x的…
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 3 12 4 -1004 5 10写树形dp的时候,WA了好多次,错误在于:记录单链的时候,一个节点的最长单链不一定等于:边权+孩子的最长单链还可以不选孩子,只要边权就行!!!!!!如果边权非负的话,就是 边权+孩子的最长单链 了. 思路: dp[u][0],记录的是以u为根结点的子树中的最长路 d…
题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖分. \(O(1)\)继承重儿子的信息,再暴力合并其他轻儿子的信息,时间复杂度是线性的. 继承重儿子用指针实现,非常巧妙. #include <cstdio> int xjc; char ch; inline int read(){ xjc = 0; ch = getchar(); while(c…
最长路: 设置一个虚拟起点和虚拟终点,每个点与起点间一条负边,值为这个点书的价值的相反数(代表买书花钱),每个点与终点连一条正边,值为这个点的书的价格(代表卖书赚钱). 然后按照图中给的边建无向边,权值为负(代表路费).跑最长路,spfa改一下松弛条件就行 #include<cstdio> #include<vector> #include<cstring> #include<queue> using namespace std; +; const int…
传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j​表示iii子树中离iii距离为jjj的点数,gi,jg_{i,j}gi,j​表示iii子树中所有满足dist(lca(u,v),i)−dist(lca(u,v),i)=jdist(lca(u,v),i)-dist(lca(u,v),i)=jdist(lca(u,v),i)−dist(lca(u,v),i)=j的点对数…
链接:https://ac.nowcoder.com/acm/contest/558/G 来源:牛客网 路径 小猫在研究树. 小猫在研究路径. 给定一棵N个点的树,每条边有边权,请你求出最长的一条路径,满足经过每个点最多一次,经过的边的条数为偶数,且边权和最大. 请输出这个最大的边权和. 输入描述: 第一行一个正整数N,表示节点个数. 接下来N−1行,第i行三个正整数 ui,vi,wi,表示第i条边连接点ui,vi,边权为wi. 输出描述: 一行一个正整数,表示最大的边权和. 示例1 输入 复制…
题意:求出的树中距离最远的两个结点之间相隔的距离. 水题一道,以前只会用路的直径来解. 代码如下: #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<memory> #include<algorithm> using namespace std; ; int dis[maxn],Laxt[maxn],Next[maxn],T…
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 5 Sample Output 5 题解:很神的做法. 用f[x][a]表示x子树中有多少个深度为a的点,g[x][a]表示x子树中有多少到lca距离=d的点对,且lca的深度为d-a.那么容易得到转移方程: f[x][a]+=f[y][a-1]g[x][a]+=g[y][a+1]+f[x][a]*f…
正题 题目链接:https://www.luogu.com.cn/problem/P7581 题目大意 给出\(n\)个点的有边权有根树,\(m\)次询问一个节点\(x\)的所有\(k\)级儿子两两之间路径长度. \(1\leq n,m\leq 10^6\) 解题思路 有根长剖,无根点分治.所以这题应该是长剖(?,先离线一下询问 然后略微分析一下,两两的路径长度所以需要合并两棵子树向上的路径,合并的时候又需要记录子树的\(k\)级儿子到该节点的距离和,还有\(k\)级儿子个数. 所以要记录三个东…