树
constbh
这个作者很懒,什么都没留下…
展开
-
2017多校联合训练第3场第5题
前40分钟出了两题,后面队友一直在做3题,我一直看5题。原来根本没有遇见过斯坦纳树的题,一看被吓到了。。。其实这个题就是要把树上除了根节点的其他点分为N个组,相当于给节点标号,要求最小生成树的和的最大值,根本没用到斯坦纳树。树上每一条边的贡献就是以这条边起点为跟的子树节点不同标号的数量,因为要求最大值,所以子树中标号的种类越多越好,最多为min(k,size[root]);然后乘一下加原创 2017-08-01 21:32:00 · 350 阅读 · 0 评论 -
codeforces 686D(树的重心)
原来完全没有学过树的重心的性质,看数据量大,知道只能跑一次dfs然后O(1)查询,自己瞎搞了半天一直wa。后来学习了树的重心,知道了一些性质。树的重心的性质:性质 1 :树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。性质 2 :把两棵树通过某一点相连得到一颗新的树,新的树的重心必然在连接原来两棵树重心的原创 2017-07-31 09:12:19 · 384 阅读 · 0 评论 -
hdu3887(dfs序)
问你对于每个节点,它的子树上标号比它小的点有多少个 子树的问题,dfs序可以很轻松的解决,因为点在它的子树上,所以在线段树中,必定在它的两个时间戳的区间之间,所以我们只需要从小到大考虑,它的区间里有多少个点已经放了,然后再把它放进去。很容易的解决了#include#include#includeusing namespace std;const int maxn = 10000原创 2017-09-15 10:48:00 · 453 阅读 · 0 评论 -
poj 3321(dfs序&&树状数组)
第一次知道dfs序这个东西,可以维护树上的任意一个节点,以这个节点为根的子树上的所有节点的标号。是连续的一段区间。一棵子树的所有节点在dfs序里是连续一段,主要就是利用这个性质来解题然后就是树状数组维护区间内苹果的数量另外这个题很卡时间,我用了输入输出挂才过#include#includeusing namespace std;const int maxn = 10000原创 2017-09-10 20:46:20 · 387 阅读 · 0 评论 -
BZOJ1036
树链剖分的板子题,初学先存一波板子,代码来自点击打开,感谢。#include #include #include #include using namespace std;const int N = 30005;int dep[N], fa[N], son[N], sz[N], top[N], id[N], idx, val[N];int first[N], nexts[N原创 2017-09-18 21:25:44 · 340 阅读 · 0 评论 -
lightoj1348(树链剖分&线段树)
常规树链剖分题,把点权哈希到数组中,用线段树维护。#include#include#includeusing namespace std;const int N = 30000+10;int dep[N],siz[N],fa[N],id[N],son[N],val[N],top[N],num;vectorv[N];void dfs1(int u, int f, int d) {原创 2017-09-22 15:28:47 · 278 阅读 · 0 评论 -
vijos1843(货车运输)
每个货车可以运输的最大货物量就是起点到终点的某一条路径上的最小权值,为了使运输量最大,那就是选一条路使得这条路上的最小权值边最大。于是想到最大生成树,然后就是树上查询两点之间路径上的最小值,熟练剖分可以解。#include #include #include #include using namespace std;#define Del(a,b) memset(a,b,size原创 2017-10-14 19:43:28 · 335 阅读 · 1 评论