Mountaineers Gym - 102021M (LCA+MST)
题目链接:
Mountaineers
题目大意:给你一个n*m的矩阵,a[i][j]代表当前方块的高度,然后每次询问给你一个起点和终点,然后问你在这个图上你选择一条路径,使得这条路径上的最大值尽可能的小,然后输出最大值。
具体思路:用最小生成树进行建图,首先对每个点的权值按照从小到大进行排序。每次是把上一次连通块的根作为当前的节点的儿子。正好保证了整个图是联通的,并且询问起点和中点的时候,在树上找lca就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e6+;
int father[maxn];
int vis[+][+];
int sto[maxn];
struct node
{
int x,y,id,val;
node() {}
node(int xx,int yy,int zz,int kk)
{
x=xx,y=yy,id=zz,val=kk;
}
bool friend operator < (node t1,node t2)
{
return t1.val<t2.val;
}
} q[maxn];
vector<int>Edge[maxn];
int Find(int t)
{
return t==father[t]?t:father[t]=Find(father[t]);
}
int depth[maxn];
int fa[maxn][];
void dfs(int u,int root)
{
depth[u]=depth[root]+;
fa[u][]=root;
for(int i=; (<<i)<=depth[u]; i++)
{
fa[u][i]=fa[fa[u][i-]][i-];
}
for(int i=; i<Edge[u].size(); i++)
{
int to=Edge[u][i];
if(to==root)
continue;
dfs(to,u);
}
}
int lca(int t1,int t2)
{
if(depth[t1]>depth[t2])
swap(t1,t2);
for(int i=; i>=; i--)
{
if(depth[t1]<=depth[t2]-(<<i))
{
t2=fa[t2][i];
}
}
if(t1==t2)
return t1;
for(int i=; i>=; i--)
{
if(fa[t1][i]!=fa[t2][i])
{
t1=fa[t1][i];
t2=fa[t2][i];
}
}
return fa[t1][];
}
int main()
{
int n,m,qq,tmp;
int cnt=;
scanf("%d %d %d",&n,&m,&qq);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
scanf("%d",&tmp);
sto[++cnt]=tmp;
father[cnt]=cnt;
q[cnt]=node(i,j,cnt,tmp);
}
}
sort(q+,q+cnt+);
int t1,t2;
for(int i=; i<=cnt; i++)
{
if(q[i].x!=&&vis[q[i].x-][q[i].y]&&Find(q[i].id-m)!=Find(q[i].id)){
int t1=Find(q[i].id-m);
int t2=Find(q[i].id);
Edge[q[i].id].push_back(t1);
father[t1]=q[i].id;
}
if(q[i].x!=n&&vis[q[i].x+][q[i].y]&&Find(q[i].id+m)!=Find(q[i].id)){
int t1=Find(q[i].id+m);
int t2=Find(q[i].id);
Edge[q[i].id].push_back(t1);
father[t1]=q[i].id;
}
if(q[i].y!=&&vis[q[i].x][q[i].y-]&&Find(q[i].id-)!=Find(q[i].id)){
int t1=Find(q[i].id-);
int t2=Find(q[i].id);
Edge[q[i].id].push_back(t1);
father[t1]=q[i].id;
}
if(q[i].y!=m&&vis[q[i].x][q[i].y+]&&Find(q[i].id+)!=Find(q[i].id)){
int t1=Find(q[i].id+);
int t2=Find(q[i].id);
Edge[q[i].id].push_back(t1);
father[t1]=q[i].id;
}
vis[q[i].x][q[i].y]=;
}
dfs(Find(),);
while(qq--)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
printf("%d\n",sto[lca((x1-)*m+y1,(x2-)*m+y2)]);
}
return ;
}
Mountaineers Gym - 102021M (LCA+MST)的更多相关文章
- GYM 101889I(mst+lca)
最小生成树上倍增询问裸的. const int maxn = 2e5 + 5; int n, m, q; //图 struct Edge { int u, v; ll cost; bool opera ...
- 【LCA+MST】BZOJ3732-Network
[题目大意] 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N.图中有M条边 (1<=M<=30,000) ,第j条边的长度:d_j (1<=d_j ...
- Tourists Gym - 101002I LCA——dfs+RMQ在线算法
LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先). 知识需求:1)RMQ的S ...
- [CF160D]Edges in MST (最小生成树+LCA+差分)
待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...
- Plan & Future
以下是OI省选前的数据结构与算法整理,可能还不是很全面.但是已经是全网相对比较全面的了.所有标记为“基础”“进阶”“中级”“提高”的知识为近些年来NOIp考察的内容,需重点掌握. 所有“高级”部分为N ...
- gym 101810 M. Greedy Pirate (LCA)
题目:https://codeforc.es/gym/101810/problem/M 题意:给 你一颗树,下面有m次查询,求u->v的最大值是多少,输入两点之间都会有两条边,正边有正权,反边有 ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST
E. Minimum spanning tree for each edge Connected undirected weighted graph without self-loops and ...
- uva 12655 Trucks [LCA](树链剖分+MST)
The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...
- UVA 11354 Bond(MST + LCA)
n<=50000, m<=100000的无向图,对于Q<=50000个询问,每次求q->p的瓶颈路. 其实求瓶颈路数组maxcost[u][v]有用邻接矩阵prim的方法.但是 ...
随机推荐
- 2019十二省联考 Round 1 && 济南市市中心游记
在这样一场毒瘤的省选中 这道题目无疑是命题人无私的馈赠 大量精心构造的部分分,涵盖了题目中所有涉及的算法 你可以利用这道题目,对你是否能够进入省队进行初步检查 经典的模型.较低的难度和不大的代码量,能 ...
- Install Docker Compose
https://docs.docker.com/compose/install/ sudo curl -L "https://github.com/docker/compose/releas ...
- Python--day14(迭代器)
今日主要内容 1. 带参装饰器 (了了解) 2. 迭代器(*****) 可迭代对象 迭代器对象 for迭代器 枚举对象 1. 带参装饰器 1. 通常,装饰器为被装饰的函数添加新功能,需要外界的 ...
- 记录一次无厘头的粗心失误——java后台报错:Unknown column 'xxx' in 'field list'
原因: sql文件马虎,直接用错了仓库.用的不是程序调用的仓库.而自己pojo和mapper还是采用Mybatis的逆向工程生成的.当时搞得很无厘头. 解决方案: sql用到程序指定的仓库就行啦. 总 ...
- HTTP的一些基本概念
HTTP协议:HTTP(超文本传输协议)协议就是计算机在网络中进行通信所必须共同遵守的规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器,我们目前使用的是HTTP/1.1 ...
- AppiumDesktop录制脚本
AppiumDesktop启动页面: 启动AppiumDesktop以后点击该页面右上角的Start New Session按钮,就会启动一个新的会话窗口(如下图),在这个窗口我们需要配置一些Desi ...
- rabbitmq 出现 com.rabbitmq.client.ShutdownSignalException: , ..................
-classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1. ...
- Linux(Ubuntu)------常用命令汇总
文件 unzip -O cp936 file.zip unzip -O cp936 file.zip -d dir tar -zxvf file -C dir mv [-i ] file1 file2 ...
- hdu4843(NOI2000) 古城之谜 (trie树+DP)
Description 著名的考古学家石教授在云梦高原上发现了一处古代城市遗址.让教授欣喜的是在这个他称为冰峰城(Ice-Peak City)的城市中有12块巨大石碑,上面刻着用某种文字书写的资料,他 ...
- CentOS_7下安装MySQL
卸载旧版本MySQl: 下载MySQ: MySQl官网:https://dev.mysql.com/downloads/mysql/ 版本自选,操作系统选Linux-Generic,64位系统或者32 ...