先考虑不要求有洞,那么可以将所有权值排序,然后不断插入,那么一个连通块就是一个答案,加上连通块大小即可
考虑并查集如何判断是否有洞,可以发现对于任意一个无洞的直角多边形,都有$90度内角-90度外角=4$,而如果有洞显然就不是了(容易发现如果有k个洞,那么上述的值就应是$4-4k$)
这个角度看上去很难维护,其实只需要考虑包含他的四个2*2的矩形即可(或者说这个新点的四个较上的角的变化),分类讨论:
1.相邻的两个格子都没有,新增一个90度的内角
2.相邻的两个格子恰有一个,减少一个90度的内角
3.相邻的两个格子都有,且对角没有,减少两个90度的内角,新增一个90度的外角
4.相邻的两个格子都有,且对角也有,减少一个90度的外角
由此用并查集进行维护即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 struct ji{
5 int x,y,k;
6 }a[N];
7 int n,f[N],sz[N],sum[N],vis[1005][1005],dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
8 long long ans;
9 bool cmp(ji x,ji y){
10 return x.k<y.k;
11 }
12 int id(int x,int y){
13 return (x-1)*n+y;
14 }
15 int find(int k){
16 if (k==f[k])return k;
17 return f[k]=find(f[k]);
18 }
19 void add(int x,int y){
20 sz[id(x,y)]=vis[x][y]=1;
21 for(int i=0;i<4;i++){
22 int tx=x+dx[i],ty=y+dy[i];
23 if (vis[tx][ty]){
24 if (find(id(tx,ty))==id(x,y))continue;
25 sz[id(x,y)]+=sz[find(id(tx,ty))];
26 sum[id(x,y)]+=sum[find(id(tx,ty))];
27 f[find(id(tx,ty))]=id(x,y);
28 }
29 }
30 for(int i=-1;i<2;i+=2)
31 for(int j=-1;j<2;j+=2){
32 int tx=x+i,ty=y+j,s=vis[tx][y]+vis[x][ty];
33 if (!s)sum[id(x,y)]++;
34 if (s==1)sum[id(x,y)]--;
35 if (s==2){
36 if (vis[tx][ty])sum[id(x,y)]++;
37 else sum[id(x,y)]-=3;
38 }
39 }
40 if (sum[id(x,y)]==4)ans+=sz[id(x,y)];
41 }
42 int main(){
43 scanf("%d",&n);
44 for(int i=1;i<=n;i++)
45 for(int j=1;j<=n;j++){
46 scanf("%d",&a[id(i,j)].k);
47 a[id(i,j)].x=i;
48 a[id(i,j)].y=j;
49 f[id(i,j)]=id(i,j);
50 }
51 sort(a+1,a+n*n+1,cmp);
52 for(int i=1;i<=n*n;i++)add(a[i].x,a[i].y);
53 printf("%lld",ans);
54 }

[luogu5423]Valleys的更多相关文章

  1. P3456 [POI2007]GRZ-Ridges and Valleys(bfs)

    P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...

  2. P3456 [POI2007]GRZ-Ridges and Valleys

    题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i ...

  3. 洛谷 P3456 [POI2007]GRZ-Ridges and Valleys

    P3456 [POI2007]GRZ-Ridges and Valleys 题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两 ...

  4. HDU 6357 Hills And Valleys

    Hills And Valleys 题意:给你一个序列, 可以翻转一次区间 [l, r] 求最大 非递减的 序列长度. 题解:枚举翻转区间,然后匹配. 如果不翻转区间, 那么就相当于用b[] = {0 ...

  5. HR_Counting Valleys

    把字符串数字化之后应该从 i>0开始判断而不是 i>1 因此错了4个testcases. #!/bin/python3 import math import os import rando ...

  6. HDU - 6357 Hills And Valleys(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...

  7. hdu6357 Hills And Valleys

    传送门 题目大意 给定一个序列A,求翻转A中一个区间之后的最长不降子序列的长度即翻转的区间 分析 发现直接枚举翻转的区间的话是无论如何都不行的,于是有一个非常神奇的做法.我们再设一个序列B = {0, ...

  8. 山峰和山谷 Ridges and Valleys

    题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...

  9. hdu6357 Hills And Valleys (最长不下降子序列)

    题目传送门 题意: 给你0~9的字符串,问你翻转哪个区间后使得其最长不下降子序列长度最长 思路: 因为字符是0~9,所以我们可以定义一个b数组来枚举L,R, 去和原来的字符串去求最长公共子序列长度,不 ...

随机推荐

  1. 从零入门 Serverless | 企业级 CI/CD 工具部署 Serverless 应用的落地实践

    背景知识 通过以往几节课程的学习,相信大家对于 SAE 平台已经有了一定的了解.SAE 为客户免除了很多复杂的运维工作,开箱即用.按用量付费:与此同时 SAE 提供了丰富的 Open API,可以很容 ...

  2. 浅谈一手MYSQL设计规范

    前言: 最近牵头搞一个机场管理集团的项目,发现团队中的成员对于库表设计,有非常多的盲区.所以决定写一篇文章,总结一下最近工作的几年中,常用的一些数据库设计规范和思路. 目的 MySQL数据库与 Ora ...

  3. 题解 「CTSC2018暴力写挂」

    题目传送门 题目大意 给出两个大小为 \(n\) 的树,求出: \[\max\{\text{depth}(x)+\text{depth}(y)-\text{depth}(\text{LCA}(x,y) ...

  4. Java(46)类加载器

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201673.html 博客主页:https://www.cnblogs.com/testero ...

  5. el-scrollbar滚动条置底

    <el-scrollbar ref="leftScrollbar" style="height: 600px"></el-scrollbar& ...

  6. 用cmd命令行创建vue项目模板

    1.进入cmd命令行 输入存放项目的位置 2.通过vue create 项目名称 创建项目 3.选择Manually select features 4.通过空格选中第1.2.5.6.7.去掉8 4. ...

  7. Swift-技巧(二)模糊脸部功能

    摘要 本文介绍模糊脸部的功能逻辑和实现方式,实现方式会尽可能的使用苹果提供的 API,保证功能高效率和简洁. 逻辑 模糊脸部的逻辑主要有两个流程,就是先找到脸部,然后模糊脸部,那么就引申出这两个实现问 ...

  8. 在纯JaveScript中实现报表导出:从“PDF”到“JPG”

    我们在前端报表中完成了各种工作数据的输入或内容处理之后,需要做什么? 数据的导出! 这些数据的常用导出格式有:PDF.Excel.HTML和图片几大类型. 但总有一些实际应用场景,需要的不仅仅是将现有 ...

  9. Language Server for Java™ 1.0 在VS Code上正式发布!

    Nick Zhu form Senior Program Manager, Developer Division at Microsoft 今天,我们很高兴与大家宣布:Language Server ...

  10. exec系统调用 && 进程的加载过程

    exec系统调用会从指定的文件中读取并加载指令,并替代当前调用进程的指令.从某种程度上来说,这样相当于丢弃了调用进程的内存,并开始执行新加载的指令. exec系统调用会保留当前的文件描述符表单.所以任 ...