NOIP 2013货车运输
当然这题有很多做法,但是我看到没有人写DSU的很惊奇
按照之前做连双向边题的经验,这题可以用并查集维护联通
然后对于每个询问\(x,y\),考虑启发式合并
当两个点集\(x,y\)合并时,一些涉及到其中点的询问可以被解决,而遍历\(x,y\)中的询问集其实是等价的,所以可以直接用启发式合并存下这个点集涉及到的询问,在合并时我们要遍历数组,所以可以同时完成对于询问的回答
typedef long long ll;
#define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(int i=a,i##end=b;i>=i##end;--i)
char IO;
int rd(){
int s=0,f=0;
while(!isdigit(IO=getchar())) if(IO=='-') f=1;
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
}
const int N=1e5+10;
int n,m,q;
struct Edge{
int u,v,x;
void Get(){ u=rd(),v=rd(),x=rd(); }
bool operator < (const Edge __) const {
return x>__.x;
}
}e[N];
int ans[N];
struct Query{
int x,id;
};
vector <Query> V[N];
int fa[N];
int Find(int x){ return fa[x]==x?x:fa[x]=Find(fa[x]);}
int main(){
n=rd(),m=rd();
rep(i,1,n) fa[i]=i;
rep(i,1,m) e[i].Get();
sort(e+1,e+m+1);
rep(i,1,q=rd()) {
ans[i]=-1;
int x=rd(),y=rd();
V[x].push_back((Query){y,i});
V[y].push_back((Query){x,i});
}
rep(i,1,m) {
int x=Find(e[i].u),y=Find(e[i].v);
if(x==y) continue;
if(V[x].size()>V[y].size()) swap(x,y);
fa[x]=y;
rep(j,0,V[x].size()-1) {
int t=V[x][j].x,id=V[x][j].id;
if(Find(t)==y) {
ans[id]=max(ans[id],e[i].x);
} else V[y].push_back(V[x][j]);
}
}
rep(i,1,q) printf("%d\n",ans[i]);
}
非常精简
如果你不懂启发式合并的原理,我可以简单证明一下
对于这些集合,元素总数为m
每一次我们将小的集合合并到大的上面,集合大小至少是两倍,所以每个元素最多会在log2(m)次合并中被访问到
总复杂度\(q \cdot log(q)\)
NOIP 2013货车运输的更多相关文章
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- [NOIp 2013]货车运输
Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...
- NOIP 2013 货车运输 最大生成树加DFS巧妙AC
#include<set> #include<map> #include<cmath> #include<queue> #include<stac ...
- NOIP提高组 2013货车运输
觉得题目水的离开 不屑的大佬请离开 不会图论的请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 题面: 题目描述 A 国有 n 座城市,编号从 1 到 ...
- 【NOIP】提高组2013 货车运输
[算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...
- 题解 【luoguP1967 NOIp提高组2013 货车运输】
题目链接 题解 题意 给你一个无向图,求两个点之间的一条路径,使路径上的最小值最大 算法:Kruskal最大生成树+倍增lca 分析 首先容易知道,答案一定在该图的最大生成树上 之后问题便转换成了树上 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- [Noip 2013 Day1-3] 货车运输 做法总结
[Noip 2013 Day1-3] 货车运输 做法总结 Online Judge:Luogu-1967 Label:启发式合并,离线,整体二分,按秩合并,倍增,最大生成树 打模拟离线赛时做到,顺便总 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
随机推荐
- 由一个空工程改为SpringBoot工程
1.先创建一个空的工程,创建springboot 工程 必须继承spring-boot-stater-parent 2.导入依赖 <parent> <groupId>org. ...
- JavaScript 事件(基础)
一.事件 事件:触发-响应机制. 二.事件三要素 1.事件源:触发事件的元素 2.事件名称:发送了什么方式的事件 3.事件处理程序:事件触发后要执行的代码(函数形式) 三.事件的使用方式 1.获取元素 ...
- Android SDK版本号与API Level 的对应关系及发布时间(更新到28)
Android SDK版本号与API Level 的对应关系及发布时间 平台版本号 API 级别 VERSION_CODE(代号) 发布时间 Android 9.0 28 Pie/P(馅饼) 2018 ...
- MySQL-长事务详解
前言: 『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是希望大家多多支持.言归正传,本 ...
- 消息队列的作用以及kafka和activemq的对比
背景分析 消息队列这个类型的组件一直是非常重要的组件,当经过两家企业后我就很坚信这个结论了.队列这种东西,最广泛的作用还是在于解耦,宽泛一点的说,它可以将不同部门的工作内容进行有效的整合,基于一个约定 ...
- 【Iterm2】如何解决iterm2窗口自动隐藏的问题
一.问题描述 当我们使用Iterm2的Hotkey Windom功能时,通过快捷键唤起Iterm2窗口后,然后鼠标在iterm2窗口之外触发点击操作就会让 iterm2窗口自动隐藏.. 这样有时候会觉 ...
- 更改 Ubuntu 的 apt 源
1.在更改apt源之前要先备份官方自带的apt源 cd /etc/apt sudo cp sources.list sources.list.bak 2. 更改 sources.list 文件 sud ...
- 上传自己的构件(Jar)到Maven中央仓库
背景: 用了Maven之后,你有没有这样的想法,自己一直在使用别人贡献的代码,自己能不能把自己觉得好的代码也贡献出来让大家方便. 还有如果你也是一名程序员,你会不会觉得要是把自己积累起来日常常用的代码 ...
- Solr的集群搭建(索引库)
Solr的集群的搭建 Solr集群原理 SolrCloud概念以及结构 概念: SolrCloud(Solr云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用Solr ...
- 第3章 常用linux命令 3.5 文件压缩命令
实验六 文件及目录的压缩解压缩相关命令的使用 [实验目的] 1.掌握linux压缩文件实质 2.掌握linux中压缩及解压缩指令的用法 [实验环境] 1. 标准配置PC一台 2. linux操作系统: ...