题意:



思路:

搞一个priority_queue 先把边界加进去 不断取最小的 向中间扩散

//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
#define int long long
struct Node{int h,x,y;Node(int a,int b,int c){h=a,x=b,y=c;}};
priority_queue<Node>pq;
bool operator <(Node a,Node b){return a.h>b.h;}
int n,m,ans,a[305][305],xx[]={1,-1,0,0},yy[]={0,0,1,-1};
bool vis[305][305];
signed main(){
memset(vis,1,sizeof(vis));
scanf("%lld%lld",&m,&n);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%lld",&a[i][j]),vis[i][j]=0;
for(int i=1;i<=n;i++)pq.push(Node(a[i][1],i,1)),pq.push(Node(a[i][m],i,m)),vis[i][m]=vis[i][1]=1;
for(int i=2;i<=m;i++)pq.push(Node(a[1][i],1,i)),pq.push(Node(a[n][i],n,i)),vis[n][i]=vis[1][i]=1;
while(!pq.empty()){
Node t=pq.top();pq.pop();
for(int i=0;i<4;i++){
int dx=t.x+xx[i],dy=t.y+yy[i];
if(!vis[dx][dy]){
if(a[dx][dy]<t.h)ans+=t.h-a[dx][dy],pq.push(Node(t.h,dx,dy));
else pq.push(Node(a[dx][dy],dx,dy));
vis[dx][dy]=1;
}
}
}
printf("%lld\n",ans);
}

最新文章

  1. 分享10款非常有用的 Ajax 插件
  2. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
  3. 给一系列的div中的第一个添加class
  4. Subsets 子集系列问题 leetcode
  5. TCP/IP详解 学习三
  6. 认识javascript
  7. poj 2479 (DP)
  8. uva 216 Getting in Line 最短路,全排列暴力做法
  9. 【BZOJ】【3404】【USACO2009 Open】Cow Digit Game又见数字游戏
  10. 知识总结: Activity的四种启动模式
  11. boost signal2 trackable
  12. javascript深入理解js闭包(个人理解,大神勿喷)
  13. 关于数据库timestamp类型问题
  14. Xmind8 Pro安装教程 Windows
  15. JS判断页面是在浏览器还是微信打开
  16. 使用Kernel NetEm和tc模拟复杂网络环境
  17. SVN与资源库同步后动作的字母意义
  18. db2和oracle字段类型对比
  19. js中通过Object.prototype.toString方法----精确判断对象的类型
  20. Django02-路由系统urls

热门文章

  1. UI Framework-1: Aura Gesture Recognizer
  2. 手把手教你进行R语言的安装及安装过程中相关问题解决方案
  3. Windows7 安装ubuntu双系统
  4. WHU 1540 Fibonacci 递推
  5. ListView阻尼效果
  6. C++语言笔记系列之十——静态成员
  7. 12.ng-switch
  8. centos7 安装好python3 yum报错
  9. Controller接口控制器
  10. Python正则表达式的简单应用和示例演示