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

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. zabbix简介(第一章第一节)
  2. Bokeh中图形与组件的布局简介 | Bokeh 小册子
  3. 树莓派实现AD转换(pcf8591模块)
  4. ConnectionString Property - ADO
  5. C#Winform调用wsdl接口webservice#http
  6. 写一本Linux内核方面的书籍
  7. 3. 盒子模型与兼容性
  8. 关于Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码
  9. 更换根目录linux命令,linux中怎么切换到根目录
  10. excel宏的使用图解教程
  11. 新人如何快速融入团队
  12. 三国志战略版360区S4服务器合并信息,三国志战略版s4赛季开局选哪个州?平民开局起兵地推荐...
  13. 惠普服务器lio装系统,惠普Pavilion一体机一键u盘装系统win10教程
  14. 科学研究是有闲人群的玩艺———读爱因斯坦的短文有感
  15. 公众号多题库查题系统
  16. Workbench LSDYNA的子弹入水流固耦合计算
  17. play framework 提示:VerifyError错误
  18. Hi,运维,你懂Java吗-No.2:JDK介绍及安装
  19. 嵌入式学习笔记——STM32的USART通信概述
  20. 2020年游戏建模师发展前景怎么样?值不值得入坑

热门文章

  1. 怎么样去学习平面设计,学ps就是平面设计了吗?
  2. ThinkPad笔记本如何重装系统
  3. DTL常用过滤器详解
  4. Linu常用命令精选
  5. access中本年度的四月一日_2014年3月计算机二级ACCESS上机试题及详解十二
  6. Caused by: No object in the CompoundRoot has a publicly accessible property named 'y' (no setter cou
  7. git stach储藏功能(SourceTree 使用方法,Visual studio 2019 中使用
  8. oracle 19c jdbc之Reactive Streams Ingestion (RSI) Library
  9. 用C语言写一个数字版的3阶魔方
  10. so easy 的 Vue3.0自定义指令(也搜一贼)