尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

ABC394G

ABC394G
📅 发布时间:2026/6/20 10:15:16

题目要求最小化爬楼梯的次数,那么我们就要让楼层的变化尽量小,即沿线楼房高度越高越好。不难发现影响答案的是路线中的楼房高度的最小值,则需要最大化最小值。那么就不难用 Kruskal 重构树做了。对每个点进行唯一编号,相邻的点建边权为较小的的楼房高度的双向边。剩下的就是 Kruskal 的模板了。最后求解答案时有一些细节,详见代码。

时间复杂度 \(O(nm\log nm+q\log^2 nm)\),当然如果使用倍增代替树链剖分,则可以做到 \(O((nm+q)\log nm)\)。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#define N 1000001using namespace std;vector<int> G[N];
int n,m,a[1001][1001],fa[N],cnt,cnt1,hd[N],b[N],node;
int top[N],siz[N],son[N],t[N * 4],dep[N],ans,id[N],rev[N],tot;int getid( int i , int j )
{return ( i - 1 ) * m + j;
}struct E
{int v,w,nxt;
}e[N * 2];struct E1
{int u,v,w;
}e1[N * 2];void addedge( int u , int v , int w )
{cnt ++;e[cnt].v = v;e[cnt].w = w;e[cnt].nxt = hd[u];hd[u] = cnt;}void add( int u , int v , int w )
{addedge( u , v , w );addedge( v , u , w );cnt1 ++;e1[cnt1] = { u , v , w };
}bool cmp( E1 x , E1 y )
{return x.w > y.w;
}int cx( int x )
{if( x == fa[x] ) return x;return fa[x] = cx( fa[x] );
}void dfs1( int u , int ff )
{fa[u] = ff;dep[u] = dep[ff] + 1;siz[u] = 1;for( auto v : G[u] ){if( v == ff ) continue;dfs1( v , u );siz[u] += siz[v];if( siz[v] > siz[son[u]] )son[u] = v;}
}void dfs2( int u , int ff , int flag )
{id[u] = ++ tot;rev[tot] = u;if( flag ) top[u] = u;else top[u] = top[ff];if( son[u] ) dfs2( son[u] , u , 0 );for( auto v : G[u] ){if( v == ff || v == son[u] ) continue;dfs2( v , u , 1 );}
}void build( int u , int l , int r )
{if( l == r ){t[u] = b[rev[l]];return;}int mid = ( l + r ) >> 1;build( u << 1 , l , mid );build( u << 1 | 1 , mid + 1 , r );t[u] = min( t[u << 1] , t[u << 1 | 1] );
}int query( int u , int l , int r , int L , int R )
{if( L <= l && r <= R ) return t[u];int mid = ( l + r ) >> 1,mi = 10000000;if( L <= mid ) mi = min( mi , query( u << 1 , l , mid , L , R ) );if( R > mid ) mi = min( mi , query( u << 1 | 1 , mid + 1 , r , L , R ) );return mi;
}int que( int u , int v )
{int mi = 10000000;while( top[u] != top[v] ){if( dep[top[u]] > dep[top[v]] ) swap( u , v );mi = min( mi , query( 1 , 1 , node , id[top[v]] , id[v] ) );v = fa[top[v]];}if( dep[u] > dep[v] ) swap( u , v );mi = min( mi , query( 1 , 1 , node , id[u] , id[v] ) );return mi;
}int main()
{cin >> n >> m;for( int i = 1 ; i <= n ; i ++ )for( int j = 1 ; j <= m ; j ++ )cin >> a[i][j],b[getid( i , j )] = a[i][j];for( int i = 1 ; i <= n ; i ++ )for( int j = 1 ; j <= m ; j ++ ){if( i - 1 >= 1 ) add( getid( i - 1 , j ) , getid( i , j ) , min( a[i - 1][j] , a[i][j] ) );if( i + 1 <= n ) add( getid( i + 1 , j ) , getid( i , j ) , min( a[i + 1][j] , a[i][j] ) );if( j - 1 >= 1 ) add( getid( i , j - 1 ) , getid( i , j ) , min( a[i][j - 1] , a[i][j] ) );if( j + 1 <= m ) add( getid( i , j + 1 ) , getid( i , j ) , min( a[i][j + 1] , a[i][j] ) );}sort( e1 + 1 , e1 + cnt1 + 1 , cmp );for( int i = 1 ; i <= n * m * 2 ; i ++ )fa[i] = i;node = n * m;int u,v;for( int i = 1 ; i <= cnt1 ; i ++ ){u = e1[i].u,v = e1[i].v;if( cx( u ) == cx( v ) ) continue;node ++;b[node] = e1[i].w;G[node].push_back( cx( u ) );G[node].push_back( cx( v ) );fa[cx( u )] = fa[cx( v )] = node;// cout << u << ' ' << v << ' ' << e1[i].w << '\n';}// cout << node << '\n';dfs1( node , 0 );dfs2( node , 0 , 1 );build( 1 , 1 , node );int q,x1,y1,x2,y2,h1,h2,dd;cin >> q;while( q -- ){cin >> x1 >> y1 >> h1 >> x2 >> y2 >> h2;u = getid( x1 , y1 ),v = getid( x2 , y2 );// cout << u << ' ' << v << '\n';ans = 0;if( h1 > h2 ) ans += h1 - h2,h1 = h2;//比较起点与终点高度dd = que( u , v );if( dd < h1 ) ans += h1 - dd,h1 = dd;//判断沿线是否需要向下下楼ans += abs( h1 - h2 );//到达终点cout << ans << '\n';}return 0;
}
我们会走到一起的。

相关新闻

  • MX 炼石 2026 NOIP #5
  • Visual Studio 2026 预览体验版现已发布,一起来看看带来哪些新功能!
  • 小题狂练 (J)

最新新闻

  • Smoke评测:Qwen3 Max约束+23分逆袭,GPT-o3材料约束暴跌15.2分
  • 珠海修车保养门店怎么选?金鼎区域汽修门店对比与养车避坑干货 - 国麟测评
  • 给通用策略添加黑名单个股池,永久剔除ST,退市风险警示股票。
  • 重磅官宣!2026年亨得利官方售后服务门店地址全面更新|官方服务热线全新上线 - 亨得利中国服务中心
  • 如何三步搭建个人AI数字人工作室:开源Duix-Avatar终极指南
  • 从Demo狂欢到生产落地,AI Agent系统化测评完整实践指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号