原题传送门
根据两个式子展开的题目
首先按照高度从小到大排序好之后按顺序加点
对于新加的这个点,在四周四个点,如果已经加入了,就合并,用并查集维护
然后判断新加的点所属的连通块知否合法

F=E+2−V,即块数=边数+2−点数F=E+2-V,即块数=边数+2-点数F=E+2−V,即块数=边数+2−点数
F=1(边界框起来的一个大块)+元环个数+洞个数F=1(边界框起来的一个大块)+元环个数+洞个数F=1(边界框起来的一个大块)+元环个数+洞个数
定义元环为一个单位小正方形,就是四个点都已经加入的

然后合法就意味着洞的个数为0
所以并查集的同时维护E,V,元环个数E,V,元环个数E,V,元环个数,计算出洞的个数,若为0,则统计答案

Code:

#include <bits/stdc++.h>
#define maxn 800
#define int long long
using namespace std;
struct data{int h, id;
}a[maxn * maxn];
int vis[maxn][maxn], f[maxn * maxn], n, m;
long long ans, v[maxn * maxn], num[maxn * maxn], e[maxn * maxn], cnt;inline int read(){int s = 0, w = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);return s * w;
}int id(int i, int j){ return (i - 1) * n + j; }
bool cmp(data x, data y){ return x.h < y.h; }
int getfa(int k){ return k == f[k] ? k : f[k] = getfa(f[k]); }void merge(int x, int y){int s1 = getfa(x), s2 = getfa(y);if (s1 != s2) v[s2] += v[s1], e[s2] += e[s1], f[s1] = s2, cnt += num[s1];
}signed main(){//  freopen("pa.in", "r", stdin);
//  freopen("pa.out", "w", stdout);n = read();for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j){int x = id(i, j);a[x].h = read(), a[x].id = x;}sort(a + 1, a + 1 + n * n, cmp);for (int i = 1; i <= n * n; ++i) f[i] = i, v[i] = 1;for (int i = 1; i <= n * n; ++i){int pos = a[i].id, x = (pos - 1) / n + 1, y = (pos - 1) % n + 1;vis[x][y] = 1;cnt = 0;if (x > 1 && vis[x - 1][y]) ++e[pos], merge(id(x - 1, y), pos);if (x < n && vis[x + 1][y]) ++e[pos], merge(id(x + 1, y), pos);if (y > 1 && vis[x][y - 1]) ++e[pos], merge(id(x, y - 1), pos);if (y < n && vis[x][y + 1]) ++e[pos], merge(id(x, y + 1), pos);if (vis[x - 1][y - 1] && vis[x - 1][y] && vis[x][y - 1]) ++cnt;if (vis[x - 1][y] && vis[x - 1][y + 1] && vis[x][y + 1]) ++cnt;if (vis[x][y - 1] && vis[x + 1][y - 1] && vis[x + 1][y]) ++cnt;if (vis[x + 1][y] && vis[x][y + 1] && vis[x + 1][y + 1]) ++cnt;num[pos] = cnt;// printf("%lld %lld %lld : %lld %lld %lld\n", x, y, pos, e[pos], v[pos], num[pos]);if (e[pos] + 2 - v[pos] - cnt == 1) ans += v[pos];}printf("%lld\n", ans);return 0;
}

【题解】LuoGu5423:[USACO19OPEN]Valleys P相关推荐

  1. 【题解】LuoGu5425:[USACO19OPEN]I Would Walk 500 Miles

    原题传送门 首先通过打表能找到性质: x+yx+yx+y越大,最终产生的距离是越小的 以n=7500n=7500n=7500为例 7500,74997500,74997500,7499产生的数肯定是最 ...

  2. Hills And Valleys CodeForces - 1467B

    Hills And Valleys CodeForces - 1467B 题意: 修改数列中的 一个 数字 使得峰(波峰.波谷)的数量最少 题解: 修改一个数,最多只能影响左右两个数,所能减少的峰的数 ...

  3. ICPC训练联盟2021寒假冬令营(5)(部分题解):

    ICPC训练联盟2021寒假冬令营(5)(部分题解): A - Brainman Raymond Babbitt drives his brother Charlie mad. Recently Ra ...

  4. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  5. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  6. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  7. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  8. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  9. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  10. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

最新文章

  1. 软件测试培训分享:性能测试的目的是什么
  2. 【树莓派】为Ubuntu for ARM 更换中国软件源
  3. SalesArea F4 help
  4. 食疗去除头屑的小偏方 不错!
  5. 【递归与递推】青蛙过河
  6. 微信小程序模板消息群发解决思路
  7. 在互联网行业呆了这么多年
  8. SLG手游策略游戏-分析思维
  9. 全国省市json文件,省市区json文件
  10. linux drwxr-xr-x 什么意思
  11. 沧小海读《图解TCP/IP》笔记——第一章 网络基础知识
  12. 一个效率很高的汉字转拼音首字母的函数(未测试)
  13. svn篇2:idea中使用svn
  14. python怎么从excel获取数据_python怎么从excel中读取数据?/python 读取 excle
  15. 初出茅庐 你好C语言
  16. vue点击元素自身之外触发事件指令
  17. Linux下查看二进制文件
  18. 模拟美萍加密狗--Rockey2虚拟狗(四)
  19. 为什么我的索尼电视显示服务器异常,sony索尼电视机常见故障维修方法
  20. java实现串的反转

热门文章

  1. 用c语言简单的指针求进制,求助!C语言用指针函数实现十进制转,十六进制,八进制,二进制...
  2. 西南大学网络作业答案计算机,西南大学网络教育2018[9124]《计算机图像处理基础》作业标准答案.docx...
  3. 这么清晰的帮助手册,AppCube 二次体验
  4. Django DTL模板使用
  5. hu沪江计算机词汇,拼音带hu的字大全150个拼音含hu的字组词 - 小孩子点读
  6. 基于Bmob的仿微信即时聊天软件
  7. 最新中文行业垂直搜索引擎大全
  8. 菜鸟日记(yzy) 微信公众号网页的开发-websocket
  9. Handler到底是一个什么东东
  10. 谈谈基于模型的设计(Model-Based Design)