树上问题
Master.Yi
学习他人,提升自己;
提升自己,帮助他人。
展开
-
20200718模拟赛 T2 树论【换根】
题目描述题目分析读错了两遍题意。。。加棋子和换根都是对后面有影响的。换根之后子树会变化。把棋子看做一个个独立游戏,一个点的棋子的SG值是子树最大高度(到子树中最远点的距离)。因为棋子可以放到子树中除自己外任何一个点,很容易看出来。记 xxx 到以1为根时的子树中最深的点的距离为 hxh_xhx当根从 1 换到 xxx 的子树中时,xxx 的SG值会变化,这个变化与换到了 xxx 的哪个儿子中有关,不妨重链剖分,记 cxc_xcx 为当根换到 xxx 的重儿子子树内之后 xxx 的SG值原创 2020-07-18 18:58:27 · 183 阅读 · 0 评论 -
CF600E Lomsat gelral && CF741D【DSU on Tree】
题目描述:树上每个点有个颜色,记子树内出现次数最多的颜色的出现次数为cntcntcnt,求子树中出现次数为cntcntcnt的颜色的编号和。对每个子树都要算。n≤100000n\le100000n≤100000题目分析:DSU on Tree板题。存桶,先做轻儿子,清空,再做重儿子,不清空,加入轻儿子,算答案,return。也可以对每个颜色建虚树dfs求出虚树上点的标记,最后做一遍dfs从下往上合并贡献。也可以线段树合并。Code:#include<bits/stdc++.h>原创 2020-06-06 11:24:44 · 207 阅读 · 0 评论 -
关于子树背包问题合并的复杂度
dalao博客置顶nnn个点的树中选kkk个,转移形如f[u][j+t]=∑f[u][j]∗f[v][t]f[u][j+t]=\sum f[u][j]*f[v][t]f[u][j+t]=∑f[u][j]∗f[v][t],复杂度O(nk)O(nk)O(nk),证明见上。原创 2020-05-30 15:43:26 · 272 阅读 · 0 评论 -
Codeforces856D Masha and Cactus【树链的儿子之和】
题目描述:大意:给出树上的一些带权值的链,选出一些点不相交的链,使得它们的权值和最大。n,m≤2∗105n,m\le2*10^5n,m≤2∗105题目分析:问题就是怎么求删掉这条链后的极大子树的DP值。大力数据结构可以重链剖分后在每个点上存下轻儿子的DP值之和,然后往上跳重链,每次加上这条重链上存的值(单点修改区间求和),减去上一次跳上来的轻儿子,加上当前点的重儿子。复杂度O(nlog2...原创 2020-04-30 10:56:42 · 183 阅读 · 0 评论 -
模拟赛20200217【删点判断链状(适当枚举的分类讨论),到最近点的距离和(树形DP),路径某种颜色个数(动态开点线段树)】
T1:1 ≤ N ≤ 100000, 1 ≤ M ≤ 2N题解:转化条件:一个图的每个连通块为链,等价于每个点的度数小于等于 2 且无环. 转化后的条件明显更有利于解决问题。容易想到当一个点的度数==3时必然是删它或周围的点,>3时就是必删点,成环那么删去环上的某个点,我在考试的时候采用了将这些点打上idx的标记,那么要删的点就是集齐了所有idx的点(Hash实现),但是环没办法...原创 2020-02-21 23:48:29 · 155 阅读 · 0 评论 -
模拟赛20200213【增量求第n小,三角剖分分治最短路,树上路径中位数之和】
T1:n≤6500n\le6500n≤6500题解:因为10i+1/2i&1=010^{i+1}/2^i\&1=010i+1/2i&1=0, 10i/2i&1=110^i/2^i\&1=110i/2i&1=1,所以10k10^k10k的二进制表示的末尾一定有kkk个0所以可以记录长度为lenlenlen的所有合法串及其对应的二进制表示,...原创 2020-02-13 22:36:21 · 263 阅读 · 0 评论 -
模拟赛Day1(20200207) T3 二分题【对树的重心的充分利用】
题目描述:题目分析:先考虑k=nk=nk=n的情况,这是一个经典问题,结论为所有点到重心的距离和。证明:对任意一点uuu,都有dis(pi,pi+1)≤dis(pi,u)+dis(u,pi+1)dis(p_i,p_{i+1})\le dis(p_i,u)+dis(u,p_{i+1})dis(pi,pi+1)≤dis(pi,u)+dis(u,pi+1)那么就有∑i=1ndis(...原创 2020-02-03 23:54:14 · 204 阅读 · 0 评论 -
[SDOI2018]战略游戏【圆方树+链并】
题目描述:n个点m条边的无向连通图,每次询问给出SSS个点,问有多少不在SSS中的点使得在图中删去它后在SSS中存在两点u,vu,vu,v不连通。2≤n≤105,n−1≤m≤2∗105,2≤∣S∣,∑∣S∣≤2∗1052\le n\le10^5,n-1\le m\le2*10^5,2\le|S|,\sum|S|\le2*10^52≤n≤105,n−1≤m≤2∗105,2≤∣S∣,∑∣S∣≤2∗...原创 2020-01-15 09:45:34 · 139 阅读 · 0 评论 -
牛客CSP-S提高组赛前集训营5 C 神J上树【树链剖分+倍增/单调栈/区间取min线段树】
题目描述:链接:牛客CSP-S提高组赛前集训营5神树大人和神J来到了神仙树公园。遗憾的是,神仙树公园里没有任何神仙树,只有一棵n个点的普普通通的有根树(以1号点为根)。这棵树每条边有边权。神J打算在这棵树上来回横跳,但神J每次只能从一个节点u跳到它的子孙v,代价为u×dist(u,v)。v是u的子孙当且仅当u在v到根节点的路径上。神J提出了m个询问,每次询问两个点s,t,由于你是神树大人和神...原创 2019-11-08 10:16:19 · 488 阅读 · 0 评论 -
BZOJ4538/洛谷P3250: [HNOI2016]网络【树上不经过某点的路径的最大权值,O(1)求LCA+O(1)求树链的交+线段树二分】
题目描述:n个点的树,m次操作,每次可以加入一条权值为wi的路径(不改变树的结构,只用于询问),删除之前加入的一条路径,或者询问不经过某个点u的路径的最大权值。n<=100000,m<=200000题目分析:把权值在dfs序上赋给路径树链剖分之外的点,我们得到:比较暴力的树链剖分+线段树+堆的nlog3n做法不经过某个点,可以转化为权值>=mid的路径是否都经过这个点...原创 2019-10-25 20:48:56 · 1418 阅读 · 0 评论 -
BZOJ3242 快餐店【基环树直径】
题目描述:一棵正权边基环树,在树上选一个点(可以在边上),使得所有节点到它的距离的最大值最小,输出最小值。3<=n<=105题目描述:如果是一棵树,我们比较容易证明直径的中点就是最优点。考虑在基环树中有什么变化,多出了一条边。如果我们断掉一条边求直径,得出一个距离d2\frac d22d,显然这个距离是大于等于真实的所有点到这个直径中点的最大值的。考虑答案的情形,假设最优...原创 2019-10-16 23:01:05 · 411 阅读 · 1 评论 -
BZOJ2067: [Poi2004]SZN【贪心DP】
题目描述:n个点的树,问最少需要多少条线才能覆盖所有边,以及最少用线的情况下最长线的最短长度。一条边只能被覆盖一次,线与线之间点可以相交。n<=10000题目分析:我们先不考虑最少用线。一个点iii(非根节点),由于它的父亲要被覆盖,所以最少用线的情况下这条线一定可以往其中一个儿子延伸,其余儿子连到自己的这条线就要两两配对,用d[i]d[i]d[i]表示iii的度数,则iii的贡...原创 2019-10-15 13:17:33 · 173 阅读 · 0 评论 -
BZOJ4543 Hotel加强版【长链剖分】
题目描述:n<=100000的树,边权为1,选3个点。两两距离相等。有多少种方案?题目分析:树形DP,在三个点的LCA处统计答案。f[i][j]f[i][j]f[i][j]表示以iii为根深度为jjj的点的数量。g[i][j]g[i][j]g[i][j]表示以iii为根的子树中两点到lca的距离为d,lca到iii的距离为d-j,即还需要在树外找距离iii为jjj的一点的对数。转...原创 2019-10-11 15:46:25 · 178 阅读 · 0 评论 -
BZOJ 4013: [HNOI2015]实验比较【树形DP】
题目传送门分析:直接贴dalao博客。。其实还是比较好想,只不过判环的时候。。。于是后来终于想起来判环的标准方式。。。一个vis数组标记有没有访问,一个inq数组标记是否在这次的搜索栈中,如果访问到在栈中的点就说明有环,退出dfs时出栈bool check(int u){ vis[u]=inq[u]=1; for(int i=fir[u];i;i=nxt[i]) if(inq[...原创 2019-03-08 20:47:48 · 138 阅读 · 0 评论 -
BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
打完代码已经无力写博客。。。直接转吧BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)贴一贴代码作个纪念。。。购票:#include&lt;cstdio&gt;#include&lt;cctype&gt;#include&lt;vector&gt;#include&转载 2019-03-07 22:16:44 · 133 阅读 · 0 评论 -
BZOJ 4012: [HNOI2015]开店 【主席树区间修改+树剖维护路径和】
题目分析:dalao博客把距离看成dep[u]+dep[v]−2∗dep[lca]dep[u]+dep[v]-2*dep[lca]dep[u]+dep[v]−2∗dep[lca]求dep[lca]dep[lca]dep[lca]的时候就用v点在路径上打标记,u点向上统计到根的路径和(似乎是lca的老套路?)路径就用树链剖分+线段树维护由于对v点有区间限制,所以把线段树换成主席树就好了。...原创 2019-03-20 16:59:41 · 190 阅读 · 0 评论 -
BZOJ 3924: [Zjoi2015]幻想乡战略游戏 【点分树】
BZOJ传送门洛谷传送门题目分析:要计算所有点到一个点的带权距离和。先考虑如何计算:每次找重心,构造出点分树,对于树中的每个节点维护三个信息:sv[i]sv[i]sv[i]:以iii为根的子树的点权和sd[i]sd[i]sd[i]:以iii为根的子树中每个点到iii的带权距离和sf[i]sf[i]sf[i]:以iii为根的子树中每个点到iii(在点分树中)的父亲的带权距离和查询点...原创 2019-03-20 22:13:07 · 160 阅读 · 0 评论 -
JZOJ 5987 仙人掌毒题 【树剖+期望的线性性】
题面:题目分析:考场上直接跳了,结果发现。。。在树中:连通块个数 = 点 - 边仙人掌满足:如果u到v连接了一棵非树边,不妨称u到v路径上的树边被这条非树边所”覆盖”. 加边的时候保证任意一条树边至多被一条非树边所覆盖,就能确保是一棵仙人掌。上面这个可以用来维护仙人掌仙人掌中:连通块个数 = 点 - 边 + 环由期望的线性性,有 E(连通块个数) = E(点) - E(边) + E(...原创 2019-03-26 22:24:39 · 232 阅读 · 0 评论 -
BZOJ1095: [ZJOI2007]捉迷藏 【树上距离->括号序列+线段树】
题解戳这里#include<cstdio>#include<cctype>#include<algorithm>#define maxn 300005#define LL long longusing namespace std;char cb[1<<15],*cs,*ct;#define getc() (cs==ct&&am...原创 2019-03-28 10:22:50 · 221 阅读 · 0 评论 -
树链问题合集
树上差分给一条链(u,v)加1,在u处+1,v处+1,LCA处-2。用树状数组在dfs序上单点修改单点查询,但是修改是往前贡献,查询是往后查询,O(nlogn)O(nlogn)O(nlogn)。如果询问都在修改之后可以直接树形DP由下往上传,O(n)O(n)O(n)。eg:BZOJ3631: [JLOI2014]松鼠的新家查询一个点到根的路径的和有时候链上问题可以转化成两点和lca到根...原创 2019-09-14 08:59:37 · 267 阅读 · 0 评论 -
BZOJ3083: 遥远的国度【树链剖分】
题目描述:问题是这样的:遥远的国度有n个城市,这些城市构成了一颗树。这个国度有一个首都,我们可以把这个首都看做整棵树的根,首都是随时有可能变为另外一个城市的。遥远的国度的每个城市有一个防御值,有些时候RapiD会使得某两个城市之间的路径上的所有城市的防御值都变为某个值。RapiD想知道在某个时候,如果把首都看做整棵树的根的话,那么以某个城市为根的子树的所有城市的防御值最小是多少。由于Ra...原创 2019-09-19 22:17:57 · 143 阅读 · 0 评论 -
BZOJ1758: [Wc2010]重建计划【二分/迭代,长链剖分+线段树】
题目描述:n个点的树,选出k条道路,要求k在[L,U]之间,且道路的平均权值最大。(k不定)n<=100000, 边权<=106题目分析:平均值最大比较常见的思路是二分,每条边减去mid后求最大值看是否大于等于0。用f[u][i]f[u][i]f[u][i]表示以uuu为根长度为iii的链的最大权值(加上了从uuu到根的权值,方便计算)我们需要在添加儿子vvv的时候对于vv...原创 2019-10-06 09:41:26 · 171 阅读 · 0 评论 -
NOIP模拟赛20191010 T3 避难向导【树上倍增】
题目描述:n<=100000.题目分析:求直径,算系数,倍增。这里说一下询问的具体实现。如果用倍增,从x到lca是从下到上,很好求,但是从lca到y是从上到下,并不好做。log2的做法就是取上面的2k,从y跳到那个点然后判断上面是否有解。int find2(int x,int y,int q){ if(dep[x]<=dep[y]) return 0; if(dep...原创 2019-10-10 19:30:25 · 186 阅读 · 0 评论 -
BZOJ3653 谈笑风生【长链剖分】
题目描述:设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点。如果a是b的祖先,那么称“a比b不知道高明到哪里去了”。• 设a 和 b 为 T 中的两个不同节点。如果 a 与 b 在树上的距离不超过某个给定常数x,那么称“a 与b 谈笑风生”。给定一棵n个节点的有根树T,节点的编号为1 到 n,根节点为1号节点。你需要回答q 个询问,询问给定两个整数p和k,问有...原创 2019-10-10 21:43:18 · 224 阅读 · 0 评论 -
BZOJ3626 LCA 【树链剖分+线段树】
题目描述:给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。有q次询问,每次询问给出l r z,求∑l&lt;=i&lt;=rdep[LCA(i,z)]\sum_{l&lt;=i&lt;=r}dep[LCA(i,z)]∑l<=i<...原创 2019-02-10 17:48:45 · 237 阅读 · 0 评论