题目链接:

Mountaineers

 Gym - 102021M

题目大意:给你一个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)的更多相关文章

  1. GYM 101889I(mst+lca)

    最小生成树上倍增询问裸的. const int maxn = 2e5 + 5; int n, m, q; //图 struct Edge { int u, v; ll cost; bool opera ...

  2. 【LCA+MST】BZOJ3732-Network

    [题目大意] 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N.图中有M条边 (1<=M<=30,000) ,第j条边的长度:d_j (1<=d_j ...

  3. Tourists Gym - 101002I LCA——dfs+RMQ在线算法

    LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先). 知识需求:1)RMQ的S ...

  4. [CF160D]Edges in MST (最小生成树+LCA+差分)

    待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...

  5. Plan & Future

    以下是OI省选前的数据结构与算法整理,可能还不是很全面.但是已经是全网相对比较全面的了.所有标记为“基础”“进阶”“中级”“提高”的知识为近些年来NOIp考察的内容,需重点掌握. 所有“高级”部分为N ...

  6. gym 101810 M. Greedy Pirate (LCA)

    题目:https://codeforc.es/gym/101810/problem/M 题意:给 你一颗树,下面有m次查询,求u->v的最大值是多少,输入两点之间都会有两条边,正边有正权,反边有 ...

  7. 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 ...

  8. uva 12655 Trucks [LCA](树链剖分+MST)

    The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...

  9. UVA 11354 Bond(MST + LCA)

    n<=50000, m<=100000的无向图,对于Q<=50000个询问,每次求q->p的瓶颈路. 其实求瓶颈路数组maxcost[u][v]有用邻接矩阵prim的方法.但是 ...

随机推荐

  1. Ubuntu 18.04 安装 Apache, MySQL, PHP7, phpMyAdmin

    https://blog.csdn.net/sanve/article/details/80770675

  2. .NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)

    引言 上星期发布的.NET452+AdminLTE版框架得到了大家的大力支持,目前GitHub已获近100星,鄙人十分高兴能够帮助大家.其中有不少关心.NET Core的支持情况,因为未来的.NET平 ...

  3. App Inventor2项目部署到本地

    介绍App Inventor App Inventor 原是Google实验室(Google Lab)的一个子计划,该项目是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆 ...

  4. java基础-04泛型

    介绍 泛型就是数据类型的参数化表示,泛型的本质是参数化类型,常用E代表任何数据类型,在实际使用的时候把实际的数据类型传递给E. 泛型的好处是设计通用的功能,多个数据类型可以共用. 泛型类型E只能代表O ...

  5. stream流操作List工具类

    工作中操作List对于程序猿来说是"基本操作",为了更加便利,对JDK8的新特性stream流进行二次封装.话不多说,直接上代码 package com.mydemo; impor ...

  6. CS程序自动更新实现原理及代码(支持多版本多文件更新)

    公司主要项目为CS端,经常遇到客户需求变更及bug处理,在没有引用自动更新之前每次更新程序,必须手动对每个客户端进行更新,这样导致技术支持工作量特别大,也给客户不好的印象,因此我需要一个自动更新程序! ...

  7. Spring Boot + Netty 中 @Autowired, @Value 为空解决

    问题描述 使用 Spring Boot + Netty 新建项目时 Handler 中的 @Autowired, @Value 注解的始终为空值 解决方法 @Component // 1. 添加 @C ...

  8. codeforces131D

    Subway CodeForces - 131D A subway scheme, classic for all Berland cities is represented by a set of  ...

  9. Codeforces Round #543

    (比赛链接)[http://codeforces.com/contest/1120] A 给出一个长度为m的序列a 可以删除一些数 使得最后从没删的第一个数开始 每k个一截 截出的n个多重集合中 至少 ...

  10. <Android基础> (六) 数据存储 Part 3 SQLite数据库存储

    6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...