[luogu5423]Valleys
先考虑不要求有洞,那么可以将所有权值排序,然后不断插入,那么一个连通块就是一个答案,加上连通块大小即可
考虑并查集如何判断是否有洞,可以发现对于任意一个无洞的直角多边形,都有$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的更多相关文章
- P3456 [POI2007]GRZ-Ridges and Valleys(bfs)
P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...
- P3456 [POI2007]GRZ-Ridges and Valleys
题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i ...
- 洛谷 P3456 [POI2007]GRZ-Ridges and Valleys
P3456 [POI2007]GRZ-Ridges and Valleys 题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两 ...
- HDU 6357 Hills And Valleys
Hills And Valleys 题意:给你一个序列, 可以翻转一次区间 [l, r] 求最大 非递减的 序列长度. 题解:枚举翻转区间,然后匹配. 如果不翻转区间, 那么就相当于用b[] = {0 ...
- HR_Counting Valleys
把字符串数字化之后应该从 i>0开始判断而不是 i>1 因此错了4个testcases. #!/bin/python3 import math import os import rando ...
- HDU - 6357 Hills And Valleys(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...
- hdu6357 Hills And Valleys
传送门 题目大意 给定一个序列A,求翻转A中一个区间之后的最长不降子序列的长度即翻转的区间 分析 发现直接枚举翻转的区间的话是无论如何都不行的,于是有一个非常神奇的做法.我们再设一个序列B = {0, ...
- 山峰和山谷 Ridges and Valleys
题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...
- hdu6357 Hills And Valleys (最长不下降子序列)
题目传送门 题意: 给你0~9的字符串,问你翻转哪个区间后使得其最长不下降子序列长度最长 思路: 因为字符是0~9,所以我们可以定义一个b数组来枚举L,R, 去和原来的字符串去求最长公共子序列长度,不 ...
随机推荐
- PLSQL安装,PLSQL汉化,激活
一)准备工作 1.点击下载PLSQL:https://www.allroundautomations.com/registered-plsqldev/.本次安装的是12.0.7,安装版本为64位 2. ...
- 鲲鹏展翅|SphereEx 获华为鲲鹏技术认证
SphereEx Data Middleware 通过了华为鲲鹏技术认证并加入鲲鹏展翅伙伴计划,未来 SphereEx Data Middleware 产品将继续以分布式能力为基础,以数据安全.分布式 ...
- YouTube爬虫下载
最近在想用爬虫写youtube网站下载学习视频,找了好多资料也没有有个有用的. 真不容易找到几行代码,代码实现很简单,基于youtube_dl 来之不易,仅参考 from __future__ imp ...
- SpringBoot使用注解进行分页
分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一下注解的方式来进行分页. 依赖安装 需要使用的依赖: Mybatis-Plus PageHelper SpringBoo ...
- python 类中的公有属性 私有属性 实例属性
class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...
- px,dp sp是像素、尺寸、尺寸
px:即像素,1px代表屏幕上一个物理的像素点:px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同,如下图所示(图片来自android developer guide, ...
- keras框架下的深度学习(二)二分类和多分类问题
本文第一部分是对数据处理中one-hot编码的讲解,第二部分是对二分类模型的代码讲解,其模型的建立以及训练过程与上篇文章一样:在最后我们将训练好的模型保存下来,再用自己的数据放入保存下来的模型中进行分 ...
- Hash算法:双重散列
双重散列是线性开型寻址散列(开放寻址法)中的冲突解决技术.双重散列使用在发生冲突时将第二个散列函数应用于键的想法. 此算法使用: (hash1(key) + i * hash2(key)) % TAB ...
- MyBatis源码分析(二):MyBatis整体架构及原理
一.Mybatis整体架构导图 二.Mybatis的核心组成 SqlSessionFactoryBuilder(构造器): 根据配置信息(XML)生成SqlSessionFactory工厂接口,构造器 ...
- hdu 1754 I Hate It(单点更新,区段查最值)
题意: N个成绩.M个操作. Q a b:查询第a个到第b个成绩中最高成绩 U a b:将第a个成绩改成b 思路: 看代码,, 代码: const int maxn = 200010; int max ...