
数据结构-树链剖分
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
poj 3237 Tree(树链剖分)
题目链接:poj 3237 Tree题目大意:给定一棵树,三种操作:CHANGE i v:将i节点权值变为vNEGATE a b:将ab路径上所有节点的权值变为相反数QUERY a b:查询ab路径上节点权值的最大值。解题思路:树链剖分,然后用线段树维护节点权值,成端更新查询。#include #include #include using namespace原创 2014-10-17 09:37:45 · 1340 阅读 · 0 评论 -
hdu 5452 Minimum Cut(树链剖分)
题目链接:hdu 5452 Minimum Cut解题思路因为有一条一定要在给定的树上,所以我们可以求出切某条树边时,最少还需要再切割几条边可以使得该树边联通的两个点集不联通。先对给定的树做树链剖分,然后对剩余的非树边u,v,更新路径u-v上边的权值,加1。代码//#pragma comment(linker, "/STACK:1024000000,1024000000")#include <cs原创 2015-09-29 20:19:16 · 951 阅读 · 0 评论 -
hdu 5293 Tree chain problem(树链剖分+树形dp)
题目链接:hdu 5293 Tree chain problem维护dp[u], sum[u],dp[u]表示以u为根节点的子树的最优值。sum[u]表示以u节点的所有子节点的dp[v]之和。对于边a,b,w,在LCA(a,b)节点的时候进行考虑。dp[u] = min{dp[u], Sum(a,b) - Dp(a,b) + sum[u] | (ab链上的点,不包括u }#原创 2015-07-31 21:37:10 · 1335 阅读 · 0 评论 -
hdu 5296 Annoying problem(LCA)
题目链接:hdu 5296 Annoying problem先求出dfs序,然后每次修改一个节点u,找到dfs最接近u的两个点,a,b的dfs序分别大于和小于u的。修改值即为dp[u] - dp[lca(a,u)] - dp[lca(b,u)] + dp[lca(a, b)],dp[i]表示i到根节点的权值和。但集合中的节点的dfs序都大于或小于u时,a,b即用最大和最小的即可。原创 2015-07-31 21:59:40 · 819 阅读 · 0 评论 -
hdu 5029 Relief grain(树链剖分+线段树)
题目链接:hdu 5029 Relief grain题目大意:给定一棵树,然后每次操作在uv路径上为每个节点添加一个数w,最后输出每个节点个数最多的那个数。解题思路:因为是在树的路径上做操作,所以基本就是树链剖分了。只不过以前是用一个数组即可维护值,这题要用一个vector数组记录。过程中用线段树维护最大值。#pragma comment(linker, "原创 2014-10-18 10:27:24 · 1394 阅读 · 1 评论 -
hdu 4897 Little Devil I(树链剖分+线段树)
题目链接:hdu 4897 Little Devil I题目大意:给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作:1 u v:u到v路径上的边都取成相反的颜色2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一个节点在路径上)3 u v:查询u到v路径上有多少个黑色边解题思路:树链剖分,用两个线段W和L维护,W对应的是每条的黑白情况,L表示的是每个原创 2014-10-18 10:31:40 · 2208 阅读 · 0 评论 -
hdu 4912 Paths on the tree(树链剖分+贪心)
题目链接:hdu 4912 Paths on the tree题目大意:给定一棵树,和若干个通道,要求尽量选出多的通道,并且两两通道不想交。解题思路:用树链剖分求LCA,然后根据通道两端节点的LCA深度排序,从深度最大优先选,判断两个节点均没被标记即为可选通道。每次选完通道,将该通道LCA以下点全部标记。#pragma comment(linker, "/STACK:1原创 2014-10-18 08:26:53 · 1257 阅读 · 0 评论 -
uva 11354 - Bond(树链剖分)
题目链接:uva 11354 - Bond题目大意:给定一张图,每次询问两个节点路径上进过边的危险值的最大值的最小值。解题思路:首先建立最小生成数,然后根据这棵树做树链剖分。#include #include #include #include using namespace std;const int maxn = 50005;const int INF = 0原创 2014-10-18 08:24:32 · 1402 阅读 · 0 评论 -
fzu 2082 过路费(树链剖分)
题目链接:fzu 2082 过路费题目大意:略。解题思路:树链剖分裸题。#include #include #include using namespace std;const int maxn = 50005;typedef long long ll;#define lson(x) ((x)#define rson(x) (((x)int val[maxn原创 2014-10-17 18:48:05 · 855 阅读 · 0 评论 -
Codeforces 191C Fools and Roads(树链剖分)
题目链接:Codeforces 191C Fools and Roads题目大意:给定一个N节点的数,然后有M次操作,每次从u移动到v,问说每条边被移动过的次数。解题思路:树链剖分维护边,用一个数组标记即可,不需要用线段树。#include #include #include using namespace std;const int maxn = 1e5 + 5;原创 2014-10-17 18:47:22 · 1447 阅读 · 0 评论 -
hysbz 2243 染色(树链剖分)
题目链接:hysbz 2243 染色题目大意:略。解题思路:树链剖分+线段树的区间合并,但是区间合并比较简单,节点只要记录左右端点的颜色即可。#include #include #include using namespace std;const int maxn = 1e5 + 5;int N, M, ne, val[maxn], first[maxn], j原创 2014-10-17 09:41:16 · 1224 阅读 · 0 评论 -
poj 2763 Housewife Wind(树链剖分)
题目链接:poj 2763 Housewife Wind题目大意:给定一棵树,然后2种操作:0 u:输出路径s到u的权值和,并且s变成u1 i w:节点i增加w解题思路:树链剖分,然后用线段树维护,单点修改区间查询。#include #include #include using namespace std;const int maxn = 100005;原创 2014-10-17 09:33:14 · 1083 阅读 · 0 评论 -
hdu 5044 Tree(树链剖分)
题目链接:hdu 5044 Tree题目大意:给定一棵树,两种操作:ADD1 u v w:路径uv上的节点值均加上wADD2 u v w:路径uv上的边均加上w最后分别输出每个节点以及每条边的值。解题思路:树链剖分,用两个数组分别计算节点和边。#pragma comment(linker, "/STACK:1024000000,1024000000")#inclu原创 2014-10-17 19:01:54 · 906 阅读 · 1 评论 -
spoj 375. Query on a tree(树链剖分)
题目链接:spoj 375. Query on a tree题目大意: poj 3237的简化版,用同一份代码都能过。解题思路:略。#include #include #include using namespace std;const int maxn = 10005;const int INF = 0x3f3f3f3f;#define lson(x) (原创 2014-10-17 09:50:11 · 820 阅读 · 0 评论 -
hdu 3966 Aragorn's Story(树链剖分+树状数组)
题目链接:hdu 3966 Aragorn's Story题目大意:给定一个棵树,然后三种操作Q x:查询节点x的值I x y w:节点x到y这条路径上所有节点的值增加wD x y w:节点x到y这条路径上所有节点的值减少w解题思路:树链剖分,用树状数组维护每个节点的值。#pragma comment(linker, "/STACK:1024000000,1024000原创 2014-10-17 09:25:14 · 1231 阅读 · 0 评论 -
Light OJ 1348 - Aladdin and the Return Journey(树链剖分)
题目链接:Light OJ 1348 - Aladdin and the Return Journey题目大意:给定一棵树,两种操作0 i j:ij路径上的权值和1 i v:将第i个节点的权值修改为v解题思路:树链剖分的裸题。#include #include #include using namespace std;const int maxn = 300原创 2014-10-17 09:46:07 · 1076 阅读 · 0 评论 -
hysbz 1036 树的统计Count(树链剖分)
题目链接:hysbz 1036 树的统计Count题目大意:略。解题思路:树链剖分+线段树维护。#include #include #include using namespace std;const int maxn = 30005;const int INF = 0x3f3f3f3f;#define lson(x) ((x)#define rson(x)原创 2014-10-17 09:39:19 · 813 阅读 · 0 评论 -
hdu 5458 Stability(树链剖分+强连通缩点+线段树)
题目链接:hdu 5458 Stability解题思路先将操作处理一遍,获得最终图,然后对图进行双联通缩点,剩下的肯定是一棵树,然后将操作逆着做一遍,遇到删边等于是加一条边,加的这条边u,v等于是将两节点路径上的点联通起来变成一个新的双联通分量,在同一个双联通分量中,明显ans=0。所以我们用线段树维护树的每条边权,一开始全为1,每次添加一条边,就将这条路径上的边权值置为0。代码#include <原创 2015-09-29 20:45:48 · 976 阅读 · 0 评论