![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
C202044zxy
这个作者很懒,什么都没留下…
展开
-
CF1444C Team-Building
一、题目点此看题二、解法要判断二分图可以使用带权并查集,并查集上的边设置为 111 就表示两点必须异色,设置为 000 就保证两点必须同色,所以我们在相同连通块查询合法时路径上权值异或和必须是 111补充一点,上面的问题其实是判断一棵树上加入若干条边是否形成奇环,这个问题是出过题的。只用考虑树边和一条非树边形成的环是可以证明的(这里就不证明了,分类讨论即可)我们用带权并查集首先维护颜色内部的边,首先对于自己就不行的颜色排除在外,设剩下的颜色数量为sss,那么答案可以表示成:s(s−1)2−shit原创 2020-12-04 11:03:26 · 209 阅读 · 0 评论 -
[nowcoder 2020] 牛半仙的魔塔(增强版)
一、题目点此看题二、解法值得一说的是本题的数据范围,你看他构造得这么恶心,就知道是为了避免某些情况。人的攻击力一定比怪高,那么人一定打的掉血。怪物的伤害很高,人无论如何都会掉血。这告诉我们只用求减免的伤害最多就行了,也不用多么麻烦的判无解(还没有无解的数据呢!)不妨从贪心的角度思考,俗话说的好:十个贪心九个排。想要知道最优的选取顺序,可以排序!推理排序规则的方法就是我们看最好的排列方法满足什么条件,然后按照这个条件排就可以了,现在我带着你们来推一推,假设i,ji,ji,j是两个相邻的怪物(iii先被原创 2020-10-24 15:22:15 · 427 阅读 · 0 评论 -
[unknown OJ] 割海成路之日
一、题目点此看题二、解法首先要考虑没有修改的情况,这个t到达s好像是关于联通性的问题,不妨考虑并查集。考虑这个路径上只会是两种形式:1,21,21,2类边->333类边->111类边,或者是只经过1,21,21,2类边。我们不妨维护一个111类边并查集,1,21,21,2类边并查集(称为111并查集和222并查集),连通性代码如下:int connect(int a,int b){ return yi.find(a)==yi.find(p[er.find(b)])//b去找a |原创 2020-10-06 19:55:39 · 306 阅读 · 0 评论 -
CF1184E3 Daleks‘ Invasion (hard)
一、题目点此看题二、解法原创 2020-08-20 08:06:40 · 161 阅读 · 0 评论 -
CF687D Dividing Kingdom II
一、题目点此看题二、解法原创 2020-08-18 20:06:02 · 129 阅读 · 0 评论 -
CF1027F Session in BSU
一、题目点此看题二、解法原创 2020-08-18 19:53:28 · 137 阅读 · 0 评论 -
CF1044D Deduction Queries
一、题目点此看题二、解法原创 2020-08-18 19:48:43 · 153 阅读 · 0 评论 -
CF553C Love Triangles
一、题目点此看题原创 2020-08-18 19:42:25 · 158 阅读 · 1 评论 -
CF1039C Network Safety
一、题目点此看题二、解法原创 2020-08-18 19:34:37 · 134 阅读 · 0 评论 -
CF362D Fools and Foolproof Roads
一、题目点此看题二、解法首先要判断无解的情况,设tottottot为一开始的连通块数量:添加这ppp条边后连通块数量还是很多:tot−p>qtot-p>qtot−p>q一开始连通块数量就很少:tot<qtot<qtot<q连通块数量正好,需要添加边,但又不能添加其他边:!m&q=n&p!m\&q=n\&p!m&q=n&p然后观察代价的计算,是两边边权和+1+1+1,发现这和合并果子一模一样,直接来一个贪心,原创 2020-08-17 10:24:27 · 151 阅读 · 0 评论 -
[NOI2017]蔬菜
一、题目点此看题二、解法每个水果是逐渐变质的,我们可以想到不守交规这道贪心题,也就是我们先按权值从大到小排序,然后从变质的最后时间往前填充就行了,至于sss的额外收益,新建一个水果就行了。虽然变质是分阶段的,但是我们不需要把水果拆开,填充的时候逐渐增加水果的质量即可。我们还要用并查集优化填充的过程,填满mmm就不再填了。还有一个问题,我们只能针对一个固定的天数做这些操作,但是多组天数怎么办呢?我们可以先跑出一个极大天数填入的物品方案,对于一个较小的天数这些物品都是可以随便取的,iii天我们就取权值原创 2020-05-23 21:06:32 · 208 阅读 · 0 评论 -
可持久化并查集
一、题目点此看题原创 2020-05-21 14:11:56 · 124 阅读 · 0 评论 -
数学上来先打表
一、题目点此看题二、解法如果是222操作直接连向前面的点,否则连向上一个点,这样dfsdfsdfs就可以得到一个顺序,问题就变成了只需要加入单条边和回退这条加入的边,用启发式合并的并查集就可以了。为了询问我们需要值域分块,合并和回退的时候就维护一下这个块,询问的时候挨个扫值域,确定到一个值域中,然后我们就可以暴力地访问这个值域里的值,看他和当前点是不是同根,如果是的话减排名就行了。#include <cstdio>#include <vector>#include &l原创 2020-05-20 21:57:13 · 182 阅读 · 0 评论 -
[POJ 2912]Rochambeau
一、题目点此看题题目描述n个小伙伴进行猜拳游戏,除了一个比较聪明的家伙以外,其他人只会出单一的一种,给出m种猜拳的结果,要求找出那个比较聪明的小伙伴序号,并且输出在第几次猜拳可以确定。数据范围1≤n≤500,0≤m≤20001\leq n\leq 500,0\leq m\leq 20001≤n≤500,0≤m≤2000二、解法首先可以枚举聪明的人,跟聪明人有关的猜拳直接忽略,然后看剩下的猜拳会不会冲突,这里可以用带权并查集,我们先将查询的结果赋权值,===当做000,>>>当原创 2020-05-19 21:07:05 · 179 阅读 · 0 评论 -
HDU 3047 Zjnu Stadium
一、题目点此看题题目描述nnn个人,mmm个关系,每个关系描述为AAA和BBB顺时针距离为ddd,每个询问由前面的关系为判定依据,如果错误则后面无视这个关系,问最后会有多少个错误的关系。二、解法带权并查集好题,我们先规定一个合并方向,也就是把BBB合并到AAA的上面,每个节点维护一个disdisdis,表示到根的顺时针距离,我们现在考虑把BBB并到AAA上面的时候如何修改disdisdis,请看下图。容易发现yyy到rxrxrx的距离应该是dx+mdx+mdx+m,已经有了一个dydydy,所原创 2020-05-19 16:40:26 · 108 阅读 · 0 评论 -
CF576E Painting Edges
一、题目点此看题二、解法这道题很特殊,我们在做线段树分治需要边询问边插入,具体来说就是把询问搞到线段上,如果一个询问lll成功的话那么我们就把[l+1,nxt−1][l+1,nxt-1][l+1,nxt−1]之间都插入这个边,其他就是正常线段树分治了。一开始初始化的时候nnn没有赋值就锅了,还是需要写一个初始化函数。#include <cstdio>#include <vector>#include <iostream>using namespace st原创 2020-05-18 16:09:17 · 136 阅读 · 0 评论 -
CF1140F Extending Set of Points
一、题目点此看题二、解法我们考虑把每个点拆成两个点,然后每个点对就是这个二分图里面的边。考虑一个连通的二分图(用给出的点对连接)的所有边都会存在,这里给出归纳法的证明。一开始都是单个点,所以满足,如果加入一条(x1,y1)(x_1,y_1)(x1,y1)的边,那么和x1x_1x1相连的yyy,和y1y_1y1相连的xxx都会连接,原来是一个完全二分图的话现在还会是一个完全二分图。可以用启发式合并并查集来维护这个二分图,回退就记录一下就行了,维护一下xxx区域的点和yyy区域的点,贡献就是乘原创 2020-05-15 10:12:17 · 170 阅读 · 0 评论 -
CF813F Bipartite Checking
一、题目点此看题二、解法把每条边出现时间段打到线段树上面,然后跑一遍线段树。问题在于维护一个树的结构,如果一条边连接的两点暂时还不连通,我们就连接一波。否则我们看这条非树边构成的环是不是奇环,如果是的话直接不符合条件,否则没有影响(这里你需要考虑两条非树边构成的环)可以用启发式合并的并查集,可以算一个点到根的距离的奇偶disdisdis,合并(u,v)(u,v)(u,v)需要连接一条dis(u)⊕dis(v)⊕1dis(u)\oplus dis(v)\oplus 1dis(u)⊕dis(v)⊕1,原创 2020-05-14 21:26:47 · 895 阅读 · 2 评论 -
[SCOI2011]棘手的操作
一、题目点此看题二、解法维护一个左偏树和一个并查集,这道题的关键是使用惰性删除法,然而我讲不清楚,直接看代码吧(详细注释)。#include <cstdio>#include <iostream>#include <queue>using namespace std;const int M = 300005;int read(){ int ...原创 2020-04-04 11:04:21 · 141 阅读 · 0 评论 -
CF891C Envy
一、题目点此看题二、解法很容易看出来是lctlctlct吧,我们先随便搞一个最小生成树。询问时尝试加入给的边,如果给定的边已经在最小生成树中是可以的。然后判断连成的环中最大边权是否等于这条边,那我们就删去环上最大的边,然后加入这条边,把这条边打上不可替换标记,也就是把权值赋值为−1-1−1,最后再改回去。时间复杂度O(nlogn)O(n\log n)O(nlogn),但是会TTT,贴个...原创 2020-02-07 12:03:34 · 182 阅读 · 0 评论