求出左上角到每个需要保护的点左上角的最短路树,那么最优解一定圈住了它们。

然后将每个点拆成四个点,四个点之间如果没跨越最短路树的树边,那就连0权边。

每个需要保护的点四周4个点都不可通行,求出最短路即为答案。

时间复杂度$O(nm\log(nm))$。

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,int>P;
const int N=410,M=2600000;
const ll inf=1LL<<60;
int n,m,i,j,k,x,y,a[N][N],b[N][N],c[N][N];
int tot,f[N][N],X[N*N],Y[N*N],pre[N][N];
ll d[N][N];
bool vis[N][N],mark[N][N][4],del[N*N*4];
priority_queue<P,vector<P>,greater<P> >Q;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void ext(int x,int y,ll z,int p){
  if(!f[x][y]||d[x][y]<=z)return;
  d[x][y]=z,pre[x][y]=p;
  Q.push(P(z,f[x][y]));
}
void dfs(int x,int y){
  if(x==1&&y==1)return;
  if(vis[x][y])return;
  vis[x][y]=1;
  int X=x,Y=y,D=pre[x][y];
  mark[x][y][D]=1;
  if(!D)X--;
  if(D==1)X++;
  if(D==2)Y--;
  if(D==3)Y++;
  mark[X][Y][D^1]=1;
  dfs(X,Y);
}
namespace G{
int f[N][N][4],X[N*N*4],Y[N*N*4],Z[N*N*4];
int g[N*N*4],v[M],w[M],nxt[M],ed;
ll d[N*N*4];
inline void add(int x,int y,int z){
  if(del[x]||del[y])return;
  v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;
  v[++ed]=x;w[ed]=z;nxt[ed]=g[y];g[y]=ed;
}
void work(){
  Q.push(P(d[2]=0,2));
  while(!Q.empty()){
    P t=Q.top();Q.pop();
    if(d[x=t.second]<t.first)continue;
    for(i=g[x];i;i=nxt[i])if(d[x]+w[i]<d[v[i]])Q.push(P(d[v[i]]=d[x]+w[i],v[i]));
  }
  printf("%lld",d[3]);
}
}
int main(){
  read(n),read(m);
  for(i=1;i<=n;i++)for(j=1;j<=m;j++)read(a[i][j]);
  for(i=1;i<=n;i++)for(j=1;j<=m+1;j++)read(b[i][j]);
  for(i=1;i<=n+1;i++)for(j=1;j<=m;j++)read(c[i][j]);
  for(i=1;i<=n+1;i++)for(j=1;j<=m+1;j++)f[i][j]=++tot,d[i][j]=inf,X[tot]=i,Y[tot]=j;
  Q.push(P(d[1][1]=0,1));
  while(!Q.empty()){
    P t=Q.top();Q.pop();
    if(d[x=X[t.second]][y=Y[t.second]]<t.first)continue;
    ext(x+1,y,d[x][y]+b[x][y],0);
    ext(x-1,y,d[x][y]+b[x-1][y],1);
    ext(x,y+1,d[x][y]+c[x][y],2);
    ext(x,y-1,d[x][y]+c[x][y-1],3);
  }
  for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(a[i][j])dfs(i,j);
  for(tot=0,i=1;i<=n+1;i++)for(j=1;j<=m+1;j++)for(k=0;k<4;k++){
    G::f[i][j][k]=++tot,G::X[tot]=i,G::Y[tot]=j,G::Z[tot]=k;
    G::d[tot]=inf;
  }
  for(del[1]=i=1;i<=n;i++)for(j=1;j<=m;j++)if(a[i][j]){
    del[G::f[i][j][3]]=1;
    del[G::f[i+1][j][1]]=1;
    del[G::f[i][j+1][2]]=1;
    del[G::f[i+1][j+1][0]]=1;
  }
  for(i=1;i<=n;i++)for(j=1;j<=m+1;j++){
    G::add(G::f[i][j][2],G::f[i+1][j][0],b[i][j]);
    G::add(G::f[i][j][3],G::f[i+1][j][1],b[i][j]);
  }
  for(i=1;i<=n+1;i++)for(j=1;j<=m;j++){
    G::add(G::f[i][j][1],G::f[i][j+1][0],c[i][j]);
    G::add(G::f[i][j][3],G::f[i][j+1][2],c[i][j]);
  }
  for(i=1;i<=n+1;i++)for(j=1;j<=m+1;j++){
    if(!mark[i][j][0])G::add(G::f[i][j][0],G::f[i][j][1],0);
    if(!mark[i][j][1])G::add(G::f[i][j][2],G::f[i][j][3],0);
    if(!mark[i][j][2])G::add(G::f[i][j][0],G::f[i][j][2],0);
    if(!mark[i][j][3])G::add(G::f[i][j][1],G::f[i][j][3],0);
  }
  G::work();
  return 0;
}

  

BZOJ4356 : Ceoi2014 Wall的更多相关文章

  1. [poj1113][Wall] (水平序+graham算法 求凸包)

    Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...

  2. gcc -Wall -pedantic -ansi(转载)

    转载自R-G-Y-CQ的新浪博客 -Wall显示所有的警告信息 -Wall选项可以打开所有类型的语法警告,以便于确定程序源代码是否是正确的,并且尽可能实现可移植性. 对Linux开发人员来讲,GCC给 ...

  3. UVALive 2453 Wall (凸包)

    题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...

  4. write/wall 1

    linux:/opt/software/lktest/c # wallhellllllllllllllllllllooooooooooooooooo^[[AasZZZZZZ^Clinux:/opt/s ...

  5. Image Wall - jQuery &amp; CSS3 图片墙效果

    今天我们要为您展示如何基于 jQuery 和 CSS3 创建一个整洁的图片墙效果.我们的想法是在页面上洒上一些大小不同的缩略图,并在当我们点击图片时候显示丝带,会显示一些描述,再次点击缩略图时,丝带将 ...

  6. Jenkins项目构建结果通知Email的替代方案Wall Display插件

    插件:https://wiki.jenkins-ci.org/display/JENKINS/Wall+Display+Plugin 效果: 操作: 直接在一个大屏幕上打开这个项目的构建页面,那么每次 ...

  7. POJ 1113:Wall

    原文链接:https://www.dreamwings.cn/poj1113/2832.html Wall Time Limit: 1000MS   Memory Limit: 10000K Tota ...

  8. [书]WALL&#183;E、龙与地下铁、中国美丽的故事、故事新编、四十自述、书虫、人工智能、大话数据结构

    下午有时间,逛了逛了书城,看到了一些书.在这里总结一些自己的感受.   一.<龙与地下铁>     这本书是我首先看到的,就在靠前的新书区.是小说,我没看里面的内容,但是被书封皮的宣传文案 ...

  9. hdu 1348 Wall (凸包)

    Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  2. 启动eclipse时:java is started but returned code 13

    此问题是eclipse位数和java位数不匹配造成的 我的是win10 64位的eclipse + 32位的java造成的问题 查看eclipse位数:用记事本打开eclipse根目录下的eclips ...

  3. 一文让你彻底了解iOS字体相关知识

    写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在label中选择字体的font,并把font由system改成custom后 ...

  4. Java中的super与this解析

    好了,现在开始讨论this&super这两个关键字的意义和用法. 在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象 ...

  5. 大数相乘nyoj28

    描述我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 ...

  6. 资料下载:敏捷个人的成长思考.pptx(第1次线下活动2011.04)

    本文挪至 http://www.zhoujingen.cn/blog/629.html PDF下载地址:http://down.51cto.com/data/207112 推荐:你可能需要的在线电子书 ...

  7. Laravel_Elixir_gulp任务利器安装

    目录 说明 安装 1安装gulp 2安装Elixir 3Elixir快速入门 4合并cssjs 5版本控制version 6复制copy 7方法串联 1.说明 详细说明暂时省略,后期补充.小白的角度理 ...

  8. WPF学习笔记-自定义窗口

    代码部分 <Style x:Key="for_noresize_window" TargetType="{x:Type Window}"> < ...

  9. HDU 2604 - Queuing

    长度为 n 有男有女的队伍里没有 fmf 和 fff 的序列有多少 判断最后一个人无法得出结论 于是判断最后两人的递推式: fm(n) =   mm(n-1) //最后两人为fm的长度为n的队伍 只能 ...

  10. JavaSE(一) IO类层次关系和各种IO流的用法总结

    今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...