输入格式

第 \(1\) 行,三个整数 \(m,n,t\)。

第 \(2\) 到 \(m+1\) 行,\(m\) 个整数,表示海拔高度。

第 \(2+m\) 到 \(2m+1\) 行,\(m\) 个整数。第 \(i\) 行,第 \(j\) 个整数表示 \(i,j\) 是否为起点。

输出格式

所有起点的最小难度评级之和(请注意,这可能不适合32位整数,即使个别难度评级会适合)。

答案

方法 \(1\):二分答案

  1. 枚举每一个起点,并对其二分答案 \(d\)。
  2. dfs 对起点搜索连通块,上下左右移动,海拔差不超过 \(d\),检查连通块的大小是否达到 \(t\)。
  3. 对一个起点,搜索时间复杂度 \(O(n * m* \log(d))\)。
  4. 最多 \(n * m\) 个起点,总时间复杂度 \(O(n^2 * m^2 * \log(d))\)。

方法 \(2\):贪心

  1. 将格子视为点,相邻的格子之间建边,边权为海拔差。
  2. 按照边权,将 \(tot\) 条边从小到大排序。
  3. 枚举边 \(i\),第 \(i\) 条边若首次将 \(2\) 端点的连通块连接,则 \(2\) 个连通块,变大。
  4. 若合并后连通块的大小达到 \(t\),则该连通块的起点的 \(d\) 值即为 \(a[i].z\),\(ans+=e[i].w * u[i]\),清空连通块内的起点标记,继续枚举边。
  5. 答案即为 \(ans\)。
  6. 时间复杂度 \(O(n * m * \log(n * m))\)。

方法 \(2\) 代码

/*
作者:wbw_121124
*/
#include<bits/stdc++.h>
#define debug false
#define int long long
using namespace std;
const int N = 510;
int n, ans, fa[N * N], v[N * N], m, t, tot, cnt, h[N * N], u[N * N];
struct node {
int x, y, z;
bool operator< (node x)
{
return z < x.z;
}
}a[N*N*2];
int get_dis(int x, int y)
{
return (x - 1) * m + y;
}
int find(int x)
{
if (fa[x] == x)
return x;
return fa[x] = find(fa[x]);
}
void unionn(int x, int y)
{
x = find(x);
y = find(y);
if (x != y)
fa[x] = y, v[y] += v[x], u[y] += u[x], u[x] = v[x] = 0;
return;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> t;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
cin >> h[get_dis(i, j)];
v[get_dis(i, j)] = 1;
fa[get_dis(i, j)] = get_dis(i, j);
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> u[get_dis(i, j)];
for(int i=1;i<=n;i++)
for (int j = 1; j <= m; j++)
{
if (i != n)
a[++tot] = node{ get_dis(i,j),get_dis(i + 1,j),abs(h[get_dis(i,j)] - h[get_dis(i + 1,j)]) };
if (j != m)
a[++tot] = node{ get_dis(i,j),get_dis(i,j + 1),abs(h[get_dis(i,j)] - h[get_dis(i,j + 1)]) };
}
sort(a + 1, a + 1 + tot);
for(int i=1;i<=tot;i++)
if (find(a[i].x) != find(a[i].y))
{
unionn(a[i].x, a[i].y);
if (v[find(a[i].y)] >= t)
ans += u[find(a[i].y)] * a[i].z, u[find(a[i].y)] = 0;
}
cout << ans;
return 0;
}

洛谷P3101 题解的更多相关文章

  1. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  2. 洛谷P8924题解

    洛谷 P8924 题解 题目描述 给你一个函数,画出它的函数图像(* 表示经过该点,. 表示不经过该点),大小为 \(n\times m\),其中 \(x\) 的范围是 \([0,n-1]\),\(f ...

  3. 洛谷P5759题解

    本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \ ...

  4. 关于三目运算符与if语句的效率与洛谷P2704题解

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  5. c++并查集配合STL MAP的实现(洛谷P2814题解)

    不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. ...

  6. 洛谷P2607题解

    想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...

  7. 【洛谷】题解 P1056 【排座椅】

    题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...

  8. 洛谷P3572题解

    这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简 ...

  9. [洛谷P1972][题解][SDOI2009]HH的项链

    别碰我! 自己还是太蒟了…… 看了好久,最后抄参考题解打出来的…… 前面的可能影响后面的,所以按照询问右端点排序 这时候维护一个前缀和数组就可以了, 那么问题又来了,去重? 可以这样,从前往后枚举,如 ...

  10. 【洛谷P1119题解】灾后重建——(floyd)

    这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...

随机推荐

  1. TreeMap - 红黑树

    TreeMap是Map家族中的一员,也是用来存放key-value键值对的.平时在工作中使用的可能并不多,它最大的特点是遍历时是有顺序的,根据key的排序规则来 TreeMap是一个双列集合,是Map ...

  2. 熔断、限流、降级 —— SpringCloud Alibaba Sentinel

    Sentinel 简介 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统负载保护.热点防护等多个维度来帮助开发者保 ...

  3. sort与uniq

    1 sort 将文本文件内容加以排序 语法: sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>] ...

  4. js将页面上取得的元素坐标转换为电脑屏幕坐标

    代码: <!DOCTYPE html> <html> <head> <title>计算屏幕坐标</title> <meta chars ...

  5. AcWing 第 2 场周赛

    比赛链接:Here AcWing 3626. 三元一次方程 暴力即可 void solve() { int n; cin >> n; for (int i = 0; i <= n / ...

  6. VIM 入门手册, (VS Code)

    要想在VScode里使用Vim需要先行按照插件 安装 vim 插件 VS Code 中输入快捷键 shift + ctrl + x, 或直接打开 扩展安装导航 搜索 vim, 选择 Vim , 点击 ...

  7. 聚焦业务价值:分众传媒在 Serverless 上的探索和实践

    作者 | 吴松(分众传媒研发总监) **关注 Serverless 公众号后台回复 分众 即可获得云原生峰会 PPT! ** 本文总结于分众传媒研发总监吴松在阿里云云原生实战峰会上的分享,从三个方面详 ...

  8. kafka集群五、__consumer_offsets副本数修改

    系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...

  9. IDEA插件Material Theme UI 激活

    介绍 "Material Theme UI" 是一款为 IntelliJ IDEA 提供现代化材料设计主题的插件,通过重新设计IDE的外观,为开发人员带来更加美观.富有活力的用户体 ...

  10. python之pycharm常见使用技巧

    一.ctrl+d:复制