这是刘汝佳神牛《算法艺术与信息学竞赛》上有关堆的一道例题。主要思路如下:

维护一个堆,存储的是水位和高度一样的格子的高度。

1、首先把边缘点全部加到堆中

2、每次取堆中最小的一个,做一次Floodfill,如果被fill到的点比队首元素高度高,那么将这个点加入堆中,否则将该点的水位设置为队首元素的水位。

3、重复2,直到堆中没有元素。

4、最后,统计答案为每个点水位高度与实际高度的差值和。

CODE

  1 const  2     maxn=90000;  3     maxp=300;  4     ddx:array[1..4]of integer=(0,0,1,-1);  5     ddy:array[1..4]of integer=(1,-1,0,0);  6 type  7     rec=record  8         x,y,data:longint;  9         end; 10 var 11     i,j,m,n,ans                    :longint; 12     map,high                    :array[1..maxp,1..maxp]of longint; 13     v                            :array[1..maxp,1..maxp]of boolean; 14     heap_size                    :longint; 15     heap                        :array[1..maxn]of rec; 16     tmp                            :rec; 17  18 procedure down(i:longint); 19 var j:longint;tmp:rec; 20 begin 21     while (i<<1)<=heap_size do 22         begin 23             j:=i << 1; 24             if (heap[j].data>heap[j+1].data)and(j<heap_size)then inc(j); 25             if heap[j].data<heap[i].data then 26                 begin 27                     tmp:=heap[i];heap[i]:=heap[j];heap[j]:=tmp; 28                     i:=j; 29                 end else break; 30         end; 31 end; 32  33 procedure up(i:longint); 34 var j:longint;tmp:rec; 35 begin 36     while i>1 do 37         begin 38             j:=i >> 1; 39             if heap[j].data>heap[i].data then 40                 begin 41                     tmp:=heap[i];heap[i]:=heap[j];heap[j]:=tmp; 42                     i:=j; 43                 end else break; 44         end; 45 end; 46  47 procedure build_heap; 48 begin 49     for i:=(heap_size>>1)downto 1 do down(i); 50 end; 51  52 procedure floodfill(p:rec); 53 var x,y,h,t,i                :longint; 54     seq                        :array[1..maxn]of rec; 55 begin     56     h:=0;t:=1;seq[1]:=p; 57     while h<t do 58         begin 59             inc(h); 60             x:=seq[h].x;y:=seq[h].y; 61             for i:=1 to 4 do  62                 if (x+ddx[i]>0)and(y+ddy[i]>0)and(x+ddx[i]<=m)and(y+ddy[i]<=n)then  63                     begin     64                         if (not v[x+ddx[i],y+ddy[i]]) then  65                             begin 66                                 v[x+ddx[i],y+ddy[i]]:=true; 67                                 if map[x+ddx[i],y+ddy[i]]<=high[x,y] then  68                                     begin 69                                         high[x+ddx[i],y+ddy[i]]:=high[x,y]; 70                                         inc(t);seq[t].x:=x+ddx[i]; 71                                         seq[t].y:=y+ddy[i]; 72                                         seq[t].data:=map[x+ddx[i],y+ddy[i]]; 73                                     end else  74                                     begin 75                                         inc(heap_size); 76                                         heap[heap_size].x:=x+ddx[i];heap[heap_size].y:=y+ddy[i]; 77                                         heap[heap_size].data:=high[x+ddx[i],y+ddy[i]]; 78                                         up(heap_size); 79                                     end; 80                             end; 81                     end; 82         end; 83 end; 84  85 begin 86     heap_size:=0; 87     readln(n,m); 88     for i:=1 to m do 89         for j:=1 to n do 90             begin 91                 read(map[i,j]); 92                 high[i,j]:=map[i,j]; 93             end; 94     fillchar(v,sizeof(v),0); 95     for i:=1 to m do 96         begin 97             v[i,1]:=true;inc(heap_size);heap[heap_size].x:=i;heap[heap_size].y:=1;heap[heap_size].data:=map[i,1]; 98             v[i,n]:=true;inc(heap_size);heap[heap_size].x:=i;heap[heap_size].y:=n;heap[heap_size].data:=map[i,n]; 99         end;100     for j:=2 to n-1 do101         begin102             v[1,j]:=true;inc(heap_size);heap[heap_size].x:=1;heap[heap_size].y:=j;heap[heap_size].data:=map[1,j];103             v[m,j]:=true;inc(heap_size);heap[heap_size].x:=m;heap[heap_size].y:=j;heap[heap_size].data:=map[m,j];104         end;105     build_heap;106     while heap_size>0 do 107         begin108             floodfill(heap[1]);109             tmp:=heap[1];heap[1]:=heap[heap_size];heap[heap_size]:=tmp;110             dec(heap_size);111             if heap_size>0 then down(1);112         end;113     ans:=0;114     for i:=1 to m do for j:=1 to n do inc(ans,high[i,j]-map[i,j]);115     writeln(ans);116 end.

转载于:https://www.cnblogs.com/Thispoet/archive/2011/08/31/2161287.html

POJ 2227 The Wedding Juicer——堆的应用——Pku2227相关推荐

  1. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  2. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  3. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  4. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  5. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  6. HDOJ题目分类大全

    版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...

  7. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

  8. 杭电OJ题目分类(转载)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  9. hdoj杭电问题分类

    杭电上的题虽然多,但是一直苦于找不到问题分类,网页都是英文的,所以平时做题也没怎么看,今天仔细一看,问题分类竟然就在主页....做了那么久的题居然没发现,表示已经狗带..不要笑,不知道有没有像我一样傻 ...

最新文章

  1. Mysql之WHERE子句
  2. ios相机内存_ios 12功能大升级,快来体验内存释放、相机特效
  3. 求一个整数数组的最大元素,递归方法实现
  4. tomcat启动 报tomcat org.apache.catalina.LifecycleException
  5. 42岁老码农找工作记录
  6. Linux中的docker top命令
  7. UHDTV(超高清电视) 的帧率规格:120fps
  8. js阻止浏览器默认事件
  9. ui自动化分享ppt_全面迎接自动化!微软公布RPA价格,将于4月2日正式上市
  10. 大学四年计算机也许应该这样学。。。
  11. Android源码学习之接着浅析SystemServer
  12. .Net读取Excel(包括Excel2007)
  13. sony手机刷linux,索尼Z3 Z3C 5.0系统刷recovery教程_Sony Z3第三方recovery
  14. 一款简约大气的PHP短网址系统程序源码
  15. 极域电子书包课堂管理系统安装
  16. 三维激光雷达点云匹配最近工作总结
  17. 并行计算机未来发展前景
  18. 父元素上是mousedown.prevent,子元素会被携带方法,还阻止不了怎么办?
  19. Service的绑定过程
  20. Excel调用已有数据利用已经录入的项快速的生成下拉列表

热门文章

  1. dataframe输出某列的数据以及统计某列的取值种数+输出某行数据
  2. class与case class的区别(转载)
  3. virtualpc设置共享文件夹
  4. windows7下cmd中一键切换virtualenv中的Python版本
  5. 利用Certbot工具快速给网站部署Let's Encrypt免费SSL证书
  6. C++语法细节注意集锦
  7. 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)
  8. 西京学院计算机科学与技术专业怎么样,西京学院有哪些专业及什么专业好
  9. github网址无法访问怎么办?
  10. ConcurrentHashMap的实现原理和源码分析