[并查集][排序][dfs][启发式合并] JZOJ P3635 Peaks

Description

有一个居住在多山岛屿的登山家,已经攀上了一座山峰,并且要攀爬另外一座更高的山峰。

更精确地说,岛上的每一点都有一个大于零的海拔(海面的海拔为零),并且如果登山家位于海拔Ei的山峰上,那么他的目标是到达其他海拔为Ej(Ej>Ei)的山峰。因为登山家在一个山峰上,所以无法马上向上爬——为了到达一个海拔更高的地点,登山家需要先下山才能上山。下山的路不及上山精彩,因此,登山家想将从当前地点到达更高山峰途中最低点的海拔最大化。
这里写图片描述
例如,如果岛屿的轮廓如图中所示,并且登山家在海拔为E4的山峰,那么有三个山峰有更高的海拔(E5,E6和E7),但是路途中最低点最高的路径是到达海拔E7的山峰的路径——在路上他不会走到海拔E2以下(在其他路径中他必须经过海拔E1的地点)。如果他从海拔E5的山峰出发,那么对应路径经过的最低海拔为E3(到达E6的路径),但是如果他从E6 出发,那么最低点就是E1。

岛屿的地图是一个二维的N*M的矩形网格,并且描述了岛屿每一部分的海拔——格子里的数字表示岛屿对应地区的海拔。如果两个各自有公共点,那么他们相邻。因此,每个格子(除了在边界上的)和其他8个格子相邻。一条路径是一系列的格子,序列中连续的两个格子相邻。一个“平区域”是一个相同海拔格子的集合,并且集合中任意两个格子能够用仅经过这个集合内格子的路径连接。任意两个等高的相邻格子属于同一“平区域” 。一座山峰,是一个相邻的格子中没有更高海拔的“平区域”。

写一个程序,找到所有山峰,并且计算每个山峰到达更高山峰路途中最大的最低海拔。对于岛上最高的山峰(岛上没有更高的山峰),可以确定登山家会离开岛屿寻找更高的山峰,因此,路途中的最低海拔为零(海平面的海拔)。

Input

输入的第一行包含两个整数N和M(1<=N,M<=2000,N*M<=10^5),分别是地图的高和宽。

接下来N行包含岛屿地图的描述。其中每行包含M个空格隔开的整数Eij(1<=Eij<=10^6)。格子Eij(对应地图的i 行j 列)的海拔为输入的i+1行第j 个整数。

Output

输出的第一行须包含一个整数P,岛屿中山峰的个数。接下来P行须每行包含两个整数:这座山峰的海拔及到达更高山峰途中最低点海拔的最大值。这些山峰的信息按照海拔降序输出;如果若干座山峰海拔相同,那么它们按照那个最低点的海拔降序输出。

Sample Input

输入1:

6 6

21 16 9 11 6 7

21 21 10 14 15 9

18 20 8 9 13 14

11 10 9 9 8 13

8 12 12 14 13 8

7 13 12 9 5 1

输入2:

5 3

16 14 16

14 14 15

12 17 16

12 13 10

16 11 16

Sample Output

输出1:

4

21 0

15 11

14 13

13 12

输出2:

5

17 0

16 15

16 14

16 13

16 13

Data Constraint

• 15 分的数据中N<=2或M<=2。

• 50 分的数据中有P<=500。

• 80 分的数据中有P<=5000。

题解

先将通高平区域进行合并
将所有的平区域按照从高到低排个序,依次按高到低的顺序加进图中,如果邻近的平区域都没被加入进图中,那么这个平区域一定是山峰。否则这个平区域属于比自己高的邻近的山峰。 
如果一个平区域同时被属于多个山峰,那么除了最高的峰外,其他的峰都找到了一条到达更高的峰的路径,且这个平区域就是路径上高度最高的最低值(比这个最低值更低的还没有被加进图中呢)。这个时候,将小的峰往大的峰合并。 
其他的峰他们的答案一定相同,所以可以用启发式合并。 

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int z[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int fx,fy,l,n,m,t,s,num,h,x,y,xx,yy,tot,sf,v[2003][2003],visit[2003][2003],g[100003],ans[100003][2],k[100003],fa[100003],p[100003],d[2003][2003],fb[100003],go[100003*2],head[100003],next[100003*2],nx[100003*2],ny[100003*2];
bool bz[100003],b[100003];
bool cmp(int x,int y){return k[x]>k[y];}
void insert(int a,int b,int x,int y)
{go[++tot]=b;next[tot]=head[a];head[a]=tot;nx[tot]=x;ny[tot]=y;
}
int getfather(int x){if (fa[x]==x) return x; else {fa[x]=getfather(fa[x]); return fa[x];}}
void kz(int x,int y)
{visit[x][y]=num;insert(num,d[x][y],x,y);for (int i=0;i<=7;i++){int xx=x+z[i][0],yy=y+z[i][1];if (xx>=1&&x<=n&&y>=1&&y<=m&&!visit[xx][yy]) if (v[x][y]==v[xx][yy]) kz(xx,yy);}
}
void qsort(int l,int r)
{if (l>=r) return;int i=l,j=r,midx=ans[(i+j)/2][0],midy=ans[(i+j)/2][1];while (i<j){while (ans[i][0]>midx||(ans[i][0]==midx&&ans[i][1]>midy)) i++;while (ans[j][0]<midx||(ans[j][0]==midx&&ans[j][1]<midy)) j--;if (i<=j){swap(ans[i],ans[j]);i++; j--;}}qsort(l,j);qsort(i,r);}
int main()
{//freopen("peaks.in","r",stdin);//freopen("peaks.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){num++;scanf("%d",&v[i][j]);d[i][j]=num;}num=0;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (!visit[i][j]){num++;kz(i,j);k[num]=v[i][j];}for (int i=1;i<=num;i++) p[i]=i;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)for (int o=0;o<=7;o++){x=i+z[o][0]; y=j+z[o][1];if (v[x][y]>v[i][j]) bz[visit[i][j]]=1;}for (int i=1;i<=num;i++) if (!bz[i]) fb[i]=1;sort(p+1,p+num+1,cmp);for (int i=1;i<=num;i++) fa[i]=i;   for(int i=1;i<=num;i++){h=p[i];b[h]=1;for (int j=head[h];j;j=next[j]){x=nx[j];y=ny[j];for (int o=0;o<=7;o++){xx=x+z[o][0]; yy=y+z[o][1];if (visit[xx][yy]!=h&&b[visit[xx][yy]]){fx=getfather(visit[xx][yy]);fy=getfather(h);if (fx!=fy)if (k[fx]==k[fy]){fa[fy]=fx;fb[fx]+=fb[fy];}else if (k[fx]>k[fy]){fa[fy]=fx;for (int q=1;q<=fb[fy];q++){sf++;ans[sf][0]=k[fy];ans[sf][1]=k[h];}}else if (k[fx]<k[fy]){fa[fx]=fy;for (int q=1;q<=fb[fx];q++){sf++;ans[sf][0]=k[fx];ans[sf][1]=k[h];}}}}}}fx=getfather(num);for (int i=1;i<=fb[fx];i++) ans[++sf][0]=k[fx];printf("%d\n",sf);qsort(1,sf);for (int i=1;i<=sf;i++) printf("%d %d\n",ans[i][0],ans[i][1]);return 0;
}

转载于:https://www.cnblogs.com/Comfortable/p/8412231.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为汪涛:打造全场景智能联接解决方案,共建行业智能体

来源&#xff1a;华为2020年9月24日&#xff0c;在HUAWEI CONNECT 2020期间&#xff0c;华为全面阐述全场景智能联接解决方案&#xff0c;从技术、网络、行业三个层面打造泛在千兆、确定性体验和超自动化的智能联接&#xff0c;共建行业智能体。同时&#xff0c;华为面向企业发…

斐波那契数java实现_斐波那契数列Java实现[剑指offer]

描述大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&#xff0c;请你输出斐波那契数列的第n项(从0开始&#xff0c;第0项为0)。n<39题解1.递归实现采用递归的方式进行实现时&#xff0c;从第n个节点向下递归时&#xff0c;存在重复节点&#xff0c;当n越大时&…

Facebook发布AR眼镜研究项目Project Aria

Facebook来源&#xff1a;IEEE电气电子工程师近日&#xff0c;在Oculus Connect直播活动中&#xff0c;Facebook宣布了Aria项目&#xff0c;这是一个专注于构建可穿戴增强现实设备的研究项目。但这些智能眼镜更像是一个研究平台&#xff0c;而不是为消费者提供的现成的小玩意。…

博士发公众号文章也能评国奖?双一流高校新规引热议!

来源&#xff1a; 募格学术本文为募格学术撰写。参考资料&#xff1a;南京大学官网、百度百科、知乎、中央广电总台中国之声等。作为研究生来说&#xff0c;如果能在读研期间获得国家奖学金&#xff0c;是一项莫大的荣誉。不过一般&#xff0c;国家奖学金的申请条件要求都比较高…

世界的下一个主宰——人工智能

一、人工智能的诞生及发展艾伦图灵是英国数学家、逻辑学家、密码学家&#xff0c;对计算机科学的发展具有重大影响。他于1936 年提出了抽象计算“图灵机”&#xff0c;使算法的概念得以形式化&#xff0c;至今仍在许多理论和实践研究中得到应用。世人公认&#xff0c;图灵的科学…

1.5亿重奖50位青年科学家!第二届“科学探索奖”揭晓

来源&#xff1a;科学网作者&#xff1a;赵广立9月25日&#xff0c;启动资金高达10亿元的“科学探索奖”正式公布第二届获奖名单&#xff0c;50位青年科学家获奖。他们将在未来5年各获得由腾讯基金会资助的300万元科研奖金。值得一提的是&#xff0c;50位获奖者中&#xff0c;最…

dokcer3

安装好的文件位置&#xff1a;/usr/sbin/nginx&#xff1a;主程序/etc/nginx&#xff1a;存放配置文件/usr/share/nginx&#xff1a;存放静态文件/var/log/nginx&#xff1a;存放日志其实从上面的根目录文件夹可以知道&#xff0c;Linux系统的配置文件一般放在/etc&#xff0c;…

BERT为什么是NLP的革新者

来源 | AI前线作者 | Jerry Wei译者 | 马可薇策划 & 编辑 | 刘燕语言模型 BERT 可以大幅提升许多任务的性能&#xff0c;那么它成功的背后是什么呢&#xff1f;本文最初发表在 Towards Data Science 博客&#xff0c;由 InfoQ 中文站翻译并分享。什么是 BERT&#xff1f;BE…

Mac idea中git igenore设置

转载于:https://www.cnblogs.com/hoge66/p/8406290.html

一文看懂BATH新基建:5G是基础,AI是内核

文章原载于 视觉中国“新基建”政策升温&#xff0c;“竞标赛”将启。“新基建”这一概念最早提出是在2018年底的中央经济工作会议上&#xff0c;会议指出要“加快5G商用步伐&#xff0c;加强人工智能、工业互联网、物联网等新型基础设施建设”&#xff0c;“新基建”概念由此…

蒲慕明:对科学哲学的一些看法

来源 | 中国科学报作者 | 蒲慕明9月24日上午&#xff0c;“中国科学院哲学研究所揭牌仪式暨科学与哲学前沿问题研讨会”在中国科学院大学玉泉路校区举行。揭牌仪式上&#xff0c;中科院院士、中科院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;学术主任…

include动作与include指令的区别

转载于:https://www.cnblogs.com/olddriver123/p/8413098.html

【创新应用】未来10年,这些黑科技必将颠覆我们的生活

来源&#xff1a;智能研究院从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其临界点。该理事会调查走…

stm32f10x单片机进阶--spi使用

使用SPI与外部flash(MX25L6406EM21)IC通信 连接方式如上图所示&#xff0c;MCU通过SPI2与外部flash芯片进行相连接。 MCU spi2初始化定义SPI2 中所使用的SPI 端口号 spi2中 通信功能初始化 读数据与写数据 指令说明查看flash芯片的datasheet&#xff0c;mx25芯片支持按照页来写…

怎样才算世界一流大学

来源&#xff1a;图灵人工智能本文摘编自石毓智著《斯坦福的创新力&#xff1a;来自世界一流大学的启示》之放眼欧美部分&#xff0c;内容有删减&#xff0c;由安静编辑。世界一流大学大都历史悠久&#xff0c;动辄都有几百年的历史。在这个家族中&#xff0c;斯坦福是个年轻的…

2020诺奖预测出炉!一位华人学者入选

图片来源&#xff1a;nobelprize.org文章来源&#xff1a;科睿唯安&#xff08;Clarivate Analytics&#xff09;、科研圈9月23日&#xff0c;拥有Web of Science、InCites等著名论文及期刊索引平台的科睿唯安公司&#xff08;Clarivate Analytics&#xff09;宣布了2020年“引…

java的oauth2.0_[转]Java的oauth2.0 服务端与客户端的实现

oauth原理简述oauth本身不是技术&#xff0c;而是一项资源授权协议&#xff0c;重点是协议&#xff01;Apache基金会提供了针对Java的oauth封装。我们做Java web项目想要实现oauth协议进行资源授权访问&#xff0c;直接使用该封装就可以。image.png整个开发流程简述一下&#x…

数学突破奖:告诉你一个真实的数学研究

文章来源&#xff1a;科学松鼠会科学是目前人类探知客观世界最好的方式。尽管投入科学不能一蹴而就地得到切实有用的成果&#xff0c;但长远来看却是技术发展最好的动力源。与技术开发不同&#xff0c;对科学的投入更像是公益活动&#xff0c;因为科学研究得到的成果属于全人类…

重磅!“全脑介观神经联接图谱”大科学计划中国工作组成立!

来源&#xff1a;上海科技9月27日下午&#xff0c;“全脑介观神经联接图谱”大科学计划启动前期工作座谈会在上海市召开&#xff0c;本次会议明确了该计划的推进路径&#xff0c;宣布了中国工作组的成立&#xff0c;并就该计划的具体实施思路和举措进行研讨。座谈会上&#xff…

算法训练 Pollution Solution(计算几何)

问题描述作为水污染管理部门的一名雇员&#xff0c;你需要监控那些被有意无意倒入河流、湖泊和海洋的污染物。你的其中一项工作就是估计污染物对不同的水生态系统&#xff08;珊瑚礁、产卵地等等&#xff09;造成的影响。你计算所使用的模型已经在图1中被说明。海岸线&#xff…