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的方法.但是 ...
 
随机推荐
- 随机数据生成与对拍【c++版,良心讲解】
			
10.7更新:见最下面 离NOIP2018没剩多长时间了,我突然发现我连对拍还不会,于是赶紧到网上找资料,找了半天发现了一个特别妙的程序,用c++写的! 不过先讲讲随机数据生成吧. 很简单,就是写一个 ...
 - springMVC静态资源
			
静态资源放在哪 静态资源不要放在WEB-INF里面,放在和WEB-INF同级的目录里,一起放在webapp下,原生tomcat中,这里的资源可以直接访问. springmvc配置怎么写 <!-- ...
 - IDEA导入项目jar包红线、依赖问题....
			
一般遇到这种情况用以下两种方式解决....... 1.reimport包 2.清缓存重启 针对1方法: a.确实不缺包: 可以先注释掉pom文件中的jar包, 此时idea会提示import, 那就i ...
 - [Alpha阶段]第八次Scrum Meeting
			
Scrum Meeting博客目录 [Alpha阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/04/12 新主楼F座2楼 35min ...
 - Spring Boot与消息
			
一.概述 1. 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 2. 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送 ...
 - svg-sprite使用
			
chainWebpack(config) { config.module .rule('svg') .exclude.add(path.resolve(__dirname,'src/assets/ic ...
 - mysql-笔记 隔离级别、事务
			
1 隔离级别:低级别的隔离通常可以执行更高的并发,系统 开销也更低 2 Read uncommitted:事务可以读取未提交的数据,脏读,应少用 3 read committed:不可重复读,事务只能 ...
 - servlet(5) HttpSession
			
Servlet 提供的 HttpSession 接口,提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP ...
 - Java 学习(1)----- java 学习的总体感觉
			
好久没有更新博客了,是因为最近在集中精力学习java, Java 的基础知识确实是比 js 多太多了. 学习java 断断续续的差不多有一年左右的时间, 这一年来,感觉懂了一点,过一段时间又忘记了,总 ...
 - C语言函数-strcat
			
strcat: 将两个char类型连接. char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结果放 ...