BZOJ4356 : Ceoi2014 Wall
求出左上角到每个需要保护的点左上角的最短路树,那么最优解一定圈住了它们。
然后将每个点拆成四个点,四个点之间如果没跨越最短路树的树边,那就连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的更多相关文章
- @bzoj - 4356@ Ceoi2014 Wall
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出一个N*M的网格图,有一些方格里面存在城市,其中首都位于网格 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [poj1113][Wall] (水平序+graham算法 求凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- gcc -Wall -pedantic -ansi(转载)
转载自R-G-Y-CQ的新浪博客 -Wall显示所有的警告信息 -Wall选项可以打开所有类型的语法警告,以便于确定程序源代码是否是正确的,并且尽可能实现可移植性. 对Linux开发人员来讲,GCC给 ...
- UVALive 2453 Wall (凸包)
题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...
- write/wall 1
linux:/opt/software/lktest/c # wallhellllllllllllllllllllooooooooooooooooo^[[AasZZZZZZ^Clinux:/opt/s ...
- Image Wall - jQuery & CSS3 图片墙效果
今天我们要为您展示如何基于 jQuery 和 CSS3 创建一个整洁的图片墙效果.我们的想法是在页面上洒上一些大小不同的缩略图,并在当我们点击图片时候显示丝带,会显示一些描述,再次点击缩略图时,丝带将 ...
- Jenkins项目构建结果通知Email的替代方案Wall Display插件
插件:https://wiki.jenkins-ci.org/display/JENKINS/Wall+Display+Plugin 效果: 操作: 直接在一个大屏幕上打开这个项目的构建页面,那么每次 ...
- POJ 1113:Wall
原文链接:https://www.dreamwings.cn/poj1113/2832.html Wall Time Limit: 1000MS Memory Limit: 10000K Tota ...
随机推荐
- 让ASP.NET MVC不使用jsonp也可以跨域访问
跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服务器 ...
- Bootstrap简介
接下来的一段时间,想研究一下现有的网页框架,第一个不容错过的就是Bootstrap,Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CS ...
- Linux 配置NFS,文件共享
配置: 1.设定共享主机服务器 ---(注意防火墙) 编辑ipA端的/etc/exports 文件 [root@dbrac2 ~]# cat /etc/exports /media 192 ...
- Implementing Navigation with UINavigationController
Implementing Navigation with UINavigationController Problem You would like to allow your users to mo ...
- WCF批量打开服务
WCF服务.利用循环,读取配置文件,打开所有的代理服务 和关闭代理服务的方法 //list列表 ,用于存储打开的服务列表 List<ServiceHost> _host = new Lis ...
- hdu 2509 博弈 *
多堆的情况要处理好孤单堆 #include<cstdio> #include<iostream> #include<algorithm> #include<c ...
- [JavaCore] 微信手机浏览器版本判断
公司要做微支付,微信浏览器版本要大于5 package com.garinzhang.web.weixin; import org.apache.commons.lang.StringUtils; i ...
- 使用VS把ASP.NET 5的应用发布到Linux的Docker上
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:我相信未来应用程序的部署模式首选一定会是Docker,所以.NET社区的朋友也不应该忽 ...
- mysql编译时报的一个警告warning: type-punning to incomplete type might break strict-aliasing rules,可能是bug
cmake的时候报了一个警告: /softdb/mysql-5.5.37/storage/innobase/handler/ha_innodb.cc:11870: warning: type-punn ...
- 在SharePoint2010中用out-of-box的方式自定制Application Pages(AccessDenied,Confirmation,Error,Login,RequestAccess,Signout,WebDeleted)
在实际项目中需要对SharePoint2010中的AccessDenied页面进行自定制,于是乎上网搜索相关内容,经实际操作此方法可行,便以此文记录. 在SharePoint2010中,由于secur ...