数据结构---并茶几
这个作者很懒
小松萘
厉害的人可真多啊
展开
-
算法复习 - AcWing - 数据结构
237. 程序自动分析 一开始用种类并查集调了半天,,,但是这并不是要分为两类啊喂! A!=B, B!=C 不能推出A=C 因为是离线,正确的思路: (0)数据太大,离散化 (1)先把已知的相等情况处理完 (2)对于不相等的情况,如果他们已经在同一个并查集里,则出错 int f[MX]; vector<pair<int,pair<int,int>>>v; int find(int x) { return x==f[x]?x:f[x]=find(f[x]); }原创 2020-10-04 21:51:33 · 681 阅读 · 1 评论 -
种类并查集
多维护一个和祖先节点的关系,由于路径压缩的原因,我们可以很方便的维护出这个关系 关键点:与根节点,路径压缩 下面是,一些数字,分为两类,判断是不是存不存在满足条件 int f[MX]; int tag[MX];//当前节点和根节点的关系,0表示相等.1表示不相等 vector<pair<pair<int,int>,int>>v; int find(int x) { if(x==f[x]) return x; else { int原创 2020-10-04 21:18:52 · 149 阅读 · 0 评论 -
HDU - 2473 Junk-Mail Filter(并查集删点,虚点设置)
为每个结点设置映射,合并操作在映射上进行,删除操作相当于给当前结点换一个映射。 int n,m; int mp[MX],f[MX],vis[MX];//mpÐé½áµã int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } signed main() { int _=0; while(scanf("%d %d",&am...原创 2020-03-21 20:15:58 · 149 阅读 · 0 评论 -
HDU - 3926 Hand in Hand (同构图判断,哈希思想)
???? ???? ???? (1)每个人只有两只手,所以每个点最多有两条边,最后不是成链就是成环 (2)判断是否同构即判断两个图生成的链,环条数即大小是否相等 (3)一开始没有排序之后比较,而是直接比较的1~n的num与tag,,好傻,反例如下图 int tag1[MX],f1[MX],num1[MX]; int find1(int x) { return x==f1[x]?x:f1[x]=find1...原创 2020-03-14 20:16:04 · 301 阅读 · 0 评论 -
POJ - 1456 Supermarket (贪心)
???? ???? ???? 和这道题一模一样 贪心,首先肯定尽量卖出去利润大的,其次每次卖出商品的时候我们尽量在最后期限卖出(为以后卖东西腾地方),这样就和cf那道题目一样了,只不过这道题维护的是-1 //CE代码,实在懒得改了。。。 int f[MAXN]; int find(int x) { return f[x]==-1?x:f[x]=find(f[x]); } signed main() { ...原创 2020-02-25 16:30:17 · 94 阅读 · 0 评论 -
ZOJ 3261 Connections in Galaxy War(逆向并茶几,离线处理)
???? ???? ???? q次操作,每次操作删去某边或询问与某点相连的权值最大并且序列最小的点(权值要比该点大)的序号 并不会用并茶几处理删边,所以我们记录下每次操作离线处理,倒序增边,最后输出答案即可 有一个要注意的地方就是,因为是无向边,为了 保证我们查询的时候能查到某边,我们规定一边中序号小的在前。(刚开始栽在这里了) 最后就是两个样例之间有空行。 //摧毁边---->倒着加边 int n,m,q,...原创 2020-02-25 15:42:38 · 85 阅读 · 0 评论 -
HDU - 3461 Code Lock (并茶几,区间合并)
???? ???? ???? 题读了半天 题意:有一个长为n的字符串,同时该字符串上有m 个可以一起翻转的区间,如果两种字符串可以通过翻转相同,则视为一种字符串,问你长为n 的这个字符串有几种情况。 比如长为1的时候,如果没有可翻转的字符串,那就有26种情况,如果1这个位置可以翻转,那么a=b=c=d=…一共就是一种字符串。 (1)容易发现如果没有可翻转的字符串,答案即为26^n (2)每加入一个区间,方案数就减去...原创 2020-02-25 14:27:52 · 129 阅读 · 0 评论 -
CodeForces - 1315D Recommendations (集合,贪心)
???? ???? ???? 题意:每个点两个属性,a[ i ] ,t[ i ](给该点a[ i ] +1的消耗),现在要求ai各不相同,问你最小花费 (1)如果某点的t小,只要该点的ai有重叠,肯定优先改变该点,所以排序的时候我们首先按照 t 排序 (2)每次选择花费时间最小的改变—>尽量让大的不变,对于t大的点,优先加入并茶几中,以每个集合的父亲结点表示当前集合元素最小可达到位置,枚举元素并更新即可 (3...原创 2020-02-24 17:08:39 · 325 阅读 · 0 评论 -
2020牛客寒假算法基础集训营1 F - maki和tree (并查集,计数)
???? ???? ???? 和这道题简直一模一样QWQ 思路和上面链接那道题一样不再重复,有一点就是最后计算答案时,一开始for了两层 mp[ x ],T掉了,后来把式子转换一下发现可以优化掉一层for。 思路是这样的,假设现在和某个黑色点相连的白色连通块大小分别为a,b,c,d,按照我的两层for计算公式是这样的:ab+ac+ad+bc+bd+cd,经过转化为:a(b+c+d)+b(c+d)+c*d**,所以我...原创 2020-02-07 18:04:19 · 153 阅读 · 0 评论 -
CF722C Destroying Array (逆向思维,并查集)
???? ???? ???? 这题,,,QAQ一开始真的没想到, 缺少逆向思维,还有经常忘记有个算法叫二分,,QAQ 这种删除元素的经常需要考虑逆序添加元素,然后我们就可以发现一个并查集写法,,每次增加元素的时候把他和左右两边能合并的合并。 #define int ll int a[MAXN],pos[MAXN],f[MAXN], sz[MAXN]; int find(int x){ return x==f[x]?...原创 2020-02-05 15:07:03 · 161 阅读 · 0 评论 -
Educational Codeforces Round 64 (Rated for Div. 2) D - 0-1-Tree (并查集,方案数)
???? ???? ???? //可能的路;全0,全1,前一段0,后一段1 //对于只有0边存在的一个连通量,贡献为sz0*(sz0-1) //对于只有1边存在的一个连通量,贡献为sz0*(sz0-1) //前一半为0,后一半为1时,为(u,t) ,(t,v)的形式 //枚举分界点t,他的贡献就与他所在的0连通分量及1连通分量大小有关:(sz0-1) * (sz1-1) int f[2][MAXN],sz[2][...原创 2020-02-03 17:20:31 · 131 阅读 · 0 评论