当然这题有很多做法,但是我看到没有人写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货车运输的更多相关文章

  1. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  2. [NOIp 2013]货车运输

    Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...

  3. NOIP 2013 货车运输 最大生成树加DFS巧妙AC

    #include<set> #include<map> #include<cmath> #include<queue> #include<stac ...

  4. NOIP提高组 2013货车运输

    觉得题目水的离开 不屑的大佬请离开 不会图论的请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 题面: 题目描述 A 国有 n 座城市,编号从 1 到 ...

  5. 【NOIP】提高组2013 货车运输

    [算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...

  6. 题解 【luoguP1967 NOIp提高组2013 货车运输】

    题目链接 题解 题意 给你一个无向图,求两个点之间的一条路径,使路径上的最小值最大 算法:Kruskal最大生成树+倍增lca 分析 首先容易知道,答案一定在该图的最大生成树上 之后问题便转换成了树上 ...

  7. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  8. [Noip 2013 Day1-3] 货车运输 做法总结

    [Noip 2013 Day1-3] 货车运输 做法总结 Online Judge:Luogu-1967 Label:启发式合并,离线,整体二分,按秩合并,倍增,最大生成树 打模拟离线赛时做到,顺便总 ...

  9. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

随机推荐

  1. spark任务在executor端的运行过程分析

    CoarseGrainedExecutorBackend 上一篇,我们主要分析了一次作业的提交过程,严格说是在driver端的过程,作业提交之后经过DAGScheduler根据shuffle依赖关系划 ...

  2. 【JVM学习笔记二】垃圾收集器与内存分配策略

    1. 概述 1) GC的历史比Java久远 2) GC需要完成的三件事: | 哪些内存需要回收 | 什么时候回收 | 如何回收 3) Java内存运行时区域各个部分: | Java虚拟机栈.计数器.本 ...

  3. 玩转zynq7010+ FPGA点亮三色灯

    前期主要以开发Z-TURN的PL部分为主,以期望了解该芯片的逻辑架构和系统总线,以及所有外设,后面在开始PS部分的开发,闲话少说,先看整个7z010的系统框图,所有开发目前基于ISE14.6来设置, ...

  4. [转]C++类成员修饰const和mutable

    const:常量,不变的 mutable:易变的 从意思上理解,可见const和mutable是一对反义词,它们都是C++的关键字. const成员函数不能修改调用它的对象.类的成员函数可以被声明为c ...

  5. vector中的push_back函数的意思是什么

    push_back   就是在vector的末尾插入一个元素, vector 中的erase()函数,从指定容器删除指定位置的元素或者某段范围内的元素,删除之后,返回值也是一个迭代器,指向最后一个删除 ...

  6. Java面试通关要点 汇总集【最终版】

    本文转载自公众号:服务端思维,阅读大约需要7分钟.梁兄的知识储备很丰富,组织的知识星球里也是干货十足,平常还会有技术研习等活动,欢迎关注. 首先,声明下,以下知识点并非阿里的面试题.这里,笔者结合自己 ...

  7. 摘jmeter安装之后如何汉化

    下载完成后打开bin文件,选择jmeter.properties打开,搜索language,修改成zh_CN,汉化jmeter,记得去掉前面的#号,然后保存,修改完配置文件后需要重启jmeter 用的 ...

  8. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  9. Kali下安装Java环境

    <-----教你在Kali下安装Java环境-----> 1. 下载1.8u121的JAVA JDK 下载地址:http://java.sun.com/javase/downloads/i ...

  10. elastic-job-lite-console后台以服务形式运行

    原文:https://blog.csdn.net/u012637358/article/details/84846923 方式1:命令让程序一直在后台运行 nohup ./bin/start.sh & ...