输入格式

第 \(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 测试,帮助产品分享率提升超 20%

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 对 C 端产品而言,增长的核心要素之一是用户活跃度.通过各类激发互动的方式,使信息得以在关系链中流转.传播,达成有效的信息 ...

  2. HanLP — HMM隐马尔可夫模型 -- 语料库

    隐马尔可可夫模型(Hidden Markov Model,HMM)是统计模型,用于描述一个含有隐含未知参数的马尔可夫过程. HMM由初始概率分布.状态转移概率分布和观测概率分布确定. BMES =&g ...

  3. Vue 多环境配置

    没有使用 package.json 进行配置 ,改配置时不需要重新打包 Vue 多环境配置 package.json settings.js window.environment="dev& ...

  4. 【HZERO】数据导入

    #数据导入 ##文档整理 通用导入客户端 https://open.hand-china.com/hzero-docs/v1.3/zh/docs/service/import/import/ 开放平台 ...

  5. 批量上传 jar 包到远程 maven 仓库

    mvn deploy命令: mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=log-lib-1.1.jar -DgroupId=com.sun ...

  6. POJ 1456 Supermarket【贪心 + 并查集】

    http://poj.org/problem?id=1456 题意:给你 N 件不同的商品,每件商品最多可以买一次.每件物品对应两个值 pi di pi 表示物品的价值,di 表示可以买的最迟时间(也 ...

  7. Educational DP Contest R - Walk(倍增floyd,矩阵快速幂)

    题目来源:AtCoder EDU DP题集 题目链接:Here 单独拎出来是因为这道题是一个很好的板子,值得记录 题意 给定一个 n 个节点的有向图的邻接矩阵,求该有向图中长度为 k 的路径长. 解法 ...

  8. Linux下安装neo4j

    Linux下安装neo4j 一.JDK安装 参照https://www.cnblogs.com/yclh/p/14849228.html 中jdk1.8的安装 二.下载neo4j 下载地址:https ...

  9. java 将字符串变成小写 单引号内的字符串大小写不变

    public static void main(String[] args) { String str = "asdfFFFSSDAF'aaaaAAA','132213'"; Sy ...

  10. S3C2440移植linux3.4.2内核之内核裁剪

    上一节S3C2440移植linux3.4.2内核之支持YAFFS文件系统我们修改了内核支持了yaffs2文件系统,这节我们裁剪内核. 目录 为什么要裁剪内核? 首先裁剪内核里无关的CPU/单板文件 裁 ...