并查集
pbihao
这个作者很懒,什么都没留下…
展开
-
【BZOJ 4144】[AMPPZ2014]Petrol 最短路+最小生成树
首先可以很显然的知道题目中只与加油站有关,也就是说其他的点都是无用的,所以先考虑如何取代其他无用的点,如下图: 黑色代表加油站,红色代表无用的点,现在要去掉红色4号,那么考虑对于1,2,3节点新的边应该是什么样子。 考虑从3号节点到达1号,如果直接沿简单路径走,油量最小为7,而如果从3到2再到1,就只需要5就可以了,原因: b 顾这样的走法是最优的,这样一来我们就能得到一个性质,从原创 2017-02-05 19:01:53 · 1099 阅读 · 0 评论 -
【BZOJ 3910】火车 并查集
每一次lca求距离,并查集维护是否已经经过过,每一次往上跳就好了,只不过。。。为毛我这么慢?lca倍增太慢了? #include #include #include #define maxn 500021 #define LL long long using namespace std; void read(int& x){ x=0;char c=getchar(); for(;c>'9'|原创 2017-02-16 21:26:06 · 252 阅读 · 0 评论 -
【BZOJ 3080】Minimum Variance Spanning Tree kruscal
首先可以很显然的观察到边权值很小,所以方法就是枚举答案树的边权和,这样就可以算出平均值,然后把每一条边的的新权值就是边权减平均值的平方,然后做最小生成树,如果最小生成树的边权和等于枚举的边权和就用当前答案来更新最终的答案。因为每一个权值和都会枚举到,所以一定会枚举到答案的总边权和,所以一定会更新答案。 #include #include #include #include #include #d原创 2017-02-11 11:44:33 · 461 阅读 · 0 评论 -
【BZOJ 2054】疯狂的馒头 并查集
由于最后的答案纸只与最后的一次染色有关系,所以我们考虑倒过来做,每一次的染色暴力的染色,然后如果一段区间之前已经染色的话就跳过。那么我们就用并查集来维护这个跳跃的过程,fa[x]连向下一个需要染色的区域,如果fa[x]==x说明这个馒头(为什么不是饺子)需要染色#include #include #include #define maxn 1000051 using namespace std;原创 2017-01-24 17:11:55 · 282 阅读 · 0 评论