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的方法.但是 ...
随机推荐
- time-时间模块
# time模块import time# 时间戳res = time.time() # ***print(res, type(res)) # time.sleep(1) # ***# print(12 ...
- dos命令的使用
echo 百度欢迎您 >d:\1.txt F7查看执行过的命令 直接进入 D盘 d: 创建目录 md fox 在fox目录下创建子目录user md fox\user\hello1 进入到use ...
- git 版本回滚
1.克隆代码到本地 git clone http://qtools@dev.qtoolsbaby.cn:81/gitlab/qtools/jenkins_ceshi.git 2.git log 查看所 ...
- H5软键盘兼容方案
前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...
- 每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感。出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往。
每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感.出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往.
- vue打包静态资源路径不正确的解决办法【转】
vue项目完成打包上线的时候很多人都会碰到静态资源找不到的问题,常见的有两个 1.js,css路径不对 解决办法:打开config/index.js,将其中的assetsPublicPath值改为’. ...
- yk-随记
$config = Loader::loadConfig('smarty');
- Flink的高可用集群环境
Flink的高可用集群环境 Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能. 因现在主要Flink这一块做先关方面的学习, ...
- SDOI2019游记
Day0 一大早就起床,结果忙活了整整一上午. 12:20从gryz出发,路上发现把耳机和笔忘另一个背包里了(都怪老爸非得让我换背包),15:30差不多就到山师了. 山师也是蛮漂亮的,花开得挺好.到处 ...
- CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...