输入格式

第 \(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. 火山引擎 DataTester 应用故事:一个 A/B 测试,将产品 DAU 提升了数十万

      更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 疫情让线下的需求大量转移到线上,催生出了远程办公.网络授课.线上健身等新的生态现象.如何更好地为用户服务,提升 ...

  2. 火山引擎DataLeap的Catalog系统搜索实践 (二):整体架构

    整体架构 火山引擎DataLeap的Catalog搜索系统使用了开源的搜索引擎Elasticsearch进行基础的文档检索(Recall阶段),因此各种资产元数据会被存放到Elasticsearch中 ...

  3. 发布会回放|Gradio 4.0 正式发布!

    Gradio 的目标是使机器学习模型的演示更容易定制和访问,以满足不同用户的需求.在 4.0 正式版的发布活动上,Hugging Face 的 Gradio 团队介绍了自己为了提高机器学习模型的可访问 ...

  4. Windows | 安装 Docker 遇到的 WSL 2 installation is incomplete 报错的解决方案

    控制面板中打开 Windows功能,在其中勾选 适用于 Linux 的 Windows 子系统 下载 WSL 更新包(非最新版本的也会报错) 更新包下载链接:https://wslstorestora ...

  5. 【Serverless实战】传统单节点网站的Serverles

    什么是函数?刚刚考完数学没多久的我,脑里立马想到的是自变量.因变量.函数值,也就是y=f(x).当然,在计算机里,函数function往往指的是一段被定义好的代码程序,我们可以通过传参调用这个定义好的 ...

  6. <vue 路由 5、动态路由-标签上传递参数>

    一.效果 在about页面点击"我的",路径里传入了参数zhangsan,在"我的"页面里接收传递过来的张三并展现出来.注:标签中传递参数写法 二.代码结构 注 ...

  7. 深度学习基础课:使用Adam算法

    大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...

  8. docker构建java镜像,运行镜像出现 no main manifest attribute, in /xxx.jar

    背景 本文主要是一个随笔,记录一下出现"no main manifest attribute"的解决办法 问题原因 主要是近期在构建一个镜像,在镜像构建成功后,运行一直提示&quo ...

  9. VuePress搭建博客部署Gitee Pages

    使用技术 VuePress + vuepress-theme-reco VuePress简介 VuePress文档地址 简洁至上:以 Markdown 为中心的项目结构,以最少的配置帮助你专注于写作. ...

  10. 入门 shell 从脚本开始 - lazy_find

    编写脚本实现在指定文件路径下查找文件夹或文件名.   脚本如下: #!/bin/sh # lazy find # GNU All-Permissive License # Copying and di ...