P5631-最小mex生成树【线段树,并查集】
正题
题目链接:https://www.luogu.com.cn/problem/P5631
题目大意
\(n\)个点\(m\)条边的一张图,求\(mex\)值最小的一棵生成树。
解题思路
考虑比较暴力的做法,枚举答案,然后判断其他边能否构成一棵生成树。
发现一条边会被重复加入多次,可以考虑不删除其他不动的边。
具体方法在线段树上,对于边权为\(w\)的边,每次把\(w\)丢到\([1,w-1]\cup[w+1,\infty]\)这个区间。
然后在线段树上往下走,维护一个不压缩路径但是按秩合并的可撤销堆,每次走到一个节点就把这个节点上的边加入,离开的时候就撤销掉。这样到叶节点时判断是否是一棵生成树就好了。
时间复杂度\(O(n\log n\log w)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cctype>
using namespace std;
const int N=1e6+10,L=1e5+2;
struct line{
int x,y;
}cl[N];
int n,m,cnt,fa[N],siz[N];
vector<line> v[N<<1];
int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int find(int x)
{return (fa[x]==x)?x:find(fa[x]);}
void unionm(int x,int y){
x=find(x);y=find(y);
if(x==y)return;
if(siz[x]<siz[y])swap(x,y);
cl[++cnt]=(line){x,y};
siz[x]+=siz[y];fa[y]=x;
return;
}
void clear_to(int w){
while(cnt>w){
int x=cl[cnt].x,y=cl[cnt].y;
siz[x]-=siz[y];fa[y]=y;cnt--;
}
return;
}
void Change(int x,int L,int R,int l,int r,line w){
if(L==l&&R==r){v[x].push_back(w);return;}
int mid=(L+R)>>1;
if(r<=mid)Change(x*2,L,mid,l,r,w);
else if(l>mid)Change(x*2+1,mid+1,R,l,r,w);
else Change(x*2,L,mid,l,mid,w),Change(x*2+1,mid+1,R,mid+1,r,w);
return;
}
int Solve(int x,int l,int r){
int top=cnt;
for(int i=0;i<v[x].size();i++)
unionm(v[x][i].x,v[x][i].y);
if(l==r){
if(cnt==n-1)
return l;
clear_to(top);
return 0;
}
int mid=(l+r)>>1,k;
if(k=Solve(x*2,l,mid))return k;
if(k=Solve(x*2+1,mid+1,r))return k;
clear_to(top);
return 0;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)fa[i]=i,siz[i]=1;
for(int i=1;i<=m;i++){
int x=read(),y=read(),w=read()+1;
if(w!=1)Change(1,1,L,1,w-1,(line){x,y});
if(w!=L)Change(1,1,L,w+1,L,(line){x,y});
}
printf("%d\n",Solve(1,1,L)-1);
return 0;
}
P5631-最小mex生成树【线段树,并查集】的更多相关文章
- [WC2005]双面棋盘(线段树+并查集)
线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- 【XSY2707】snow 线段树 并查集
题目描述 有\(n\)个人和一条长度为\(t\)的线段,每个人还有一个工作范围(是一个区间).最开始整条线段都是白的.定义每个人的工作长度是这个人的工作范围中白色部分的长度(会随着线段改变而改变).每 ...
- 【CF687D】Dividing Kingdom II 线段树+并查集
[CF687D]Dividing Kingdom II 题意:给你一张n个点m条边的无向图,边有边权$w_i$.有q个询问,每次给出l r,问你:如果只保留编号在[l,r]中的边,你需要将所有点分成两 ...
- 【BZOJ 4662】 4662: Snow (线段树+并查集)
4662: Snow Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 136 Solved: 47 Description 2333年的某一天,临冬突 ...
- 【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)
[BZOJ4388]JOI2012 invitation Description 澳洲猴举办了一场宴会,他想要邀请A个男生和B个女生参加,这A个男生从1到A编号,女生也从1到B编号.现在澳洲猴知道n组 ...
- [HDU3710] Battle Over Cities [树链剖分+线段树+并查集+kruskal+思维]
题面 一句话题意: 给定一张 N 个点, M 条边的无向连通图, 每条边上有边权 w . 求删去任意一个点后的最小生成树的边权之和. 思路 首先肯定要$kruskal$一下 考虑$MST$里面去掉一个 ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- bzoj 2054: 疯狂的馒头(线段树||并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...
- 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集
[BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...
随机推荐
- Docker创建Docker-Registry客户端docker-registry-frontend
docker-compose.yml version: '3.1' services: frontend: image: konradkleine/docker-registry-frontend:v ...
- C#硬件访问(摄像头、麦克风)
#需要引用:AForge类库.Microsoft.DirectX using System;using System.Windows.Forms;namespace CameraTest{ publi ...
- bicabo C#多线程详解(三)
继续上一节的问题:调换两个新创建的线程启动顺序会是什么结果? using System; using System.Threading;namespace Test{ class TestThr ...
- C#设计模式---单例模式(Singleton Pattern)
一.定义 从"单例"字面意思上理解为一个类只有一个实例.官方定义:确保一个类只有一个实例,并提供一个全局访问点. 二.实现 下面以实现一个日志记录类为例,描述单例模式. 1 usi ...
- Java随手记录
Spring @Configuration注解及配置方法 转自:https://www.jb51.net/article/184822.htm Spring @Configuration注解 Spri ...
- Struts2之文件上传与下载
时间:2017-1-11 15:47 --使用commons-fileupload组件上传1.客户端 * method="post" * <input t ...
- netty系列之:轻轻松松搭个支持中文的服务器
目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都是讲 ...
- UVA1620 Lazy Susan(结论证明)
结论: 当 \(n\geq 6\) 时,若 \(n\) 是奇数且输入序列的逆序对数是奇数,则无解,否则有解. 当 \(n=4\) 或 \(n=5\) 时,答案个数及其有限,只有这个环是 \(1\) 到 ...
- 关于ubuntu使用的那些事儿
时间:2019-04-09 整理:PangYuaner 标题:Ubuntu18.04安装微信(Linux通用) 地址:https://www.cnblogs.com/dotnetcrazy/p/912 ...
- fwm环境APP菜品数据加载失败的优化操作
1)在项目的.env文件中添加如下一行: RESPONSE_CACHE_ENABLED=true 2)拷贝 laravel-worker.conf.example,将laravel字段替换为域名,并执 ...