
并查集
文章平均质量分 62
Tekim
个人写点东西的地方
展开
-
洛谷p1196银河英雄传说c++
原题把两个舰队合并起来,查询某两个舰是否在同一舰队中,简单用一下并查集就可以了。但本题不限于此,还需要求两个舰的距离,那么试试改并查集,并查集最大的特点就是利用祖先,那么他们的距离就可以用到祖先的距离差表示。现在的问题是求某点到其祖先的距离,一定不能取消路径压缩计算次数,铁定超时。开一个数组front[i]表示i点到祖先的距离,典型的加权并查集,在路径压缩时进行修改(详见代码)。原创 2017-08-31 14:35:53 · 888 阅读 · 0 评论 -
洛谷p1525关押罪犯
原题挺有意思的一道题。大多数人思路应该是贪心,将犯罪值有大到小排,将两个人放在两个并查集中,如果他们在同一个并查集就退出。这样你画一下样例就明白了,这两个人的确放在两栋楼,但是具体哪个人放在哪栋楼效果是不同的,而你要确定的话又需要枚举一遍,超时妥妥的。两个互为敌人的位置无法确定,但是很明显还是要用并查集的。敌人的敌人呢?他们是不是一定在同一栋楼?(贪心思想)所以每次可以确定在一原创 2017-08-31 14:46:35 · 383 阅读 · 0 评论 -
洛谷p1455搭配购买
原题没有搭配就是一道裸01背包,搭配的话用并查集并一并,结束后只取他们的祖先加入背包计算。#include#include#include#include#includeusing namespace std;int n,m,mon,v[10001],w[10001],fa[10001],f[10001];int find(int x){ if(fa[x]==x)原创 2017-08-31 14:58:46 · 400 阅读 · 0 评论 -
c++树状数组1模板
原题这是一个模板,奇数点存本身值,偶数点根据其二进制中1的个数存2的n次方个值,这样改值用logn就可以了。#include#include#include#include#includeusing namespace std;int n,m,a[500009],c[500009];int change(int pos,int v){ for(int i=pos;i原创 2017-08-31 15:14:26 · 1177 阅读 · 0 评论