题解:

二分+宽搜+KM

显然答案不能太大

然后二分一下

代码:

#include<bits/stdc++.h>
const int N=,M=;
using namespace std;
const int dx[]={-,,,},dy[]={,,-,};
int m,n,cnt,pt,tot,c[N][N],d[N][N],x,y,t,path[N],bo[N],inq[N][N],mp[N][N];
struct node{int x,y;}a[N],b[N],h[N+];
void bfs(int sx,int sy,int p)
{
memset(d,0x3f,sizeof(d));
d[sx][sy]=;
int i,t,head=,tail=;
node u,v;
h[].x=sx;h[].y=sy;
memset(inq,,sizeof(inq));
while (head!=tail)
{
head=head%M+;u=h[head];inq[u.x][u.y]=;
for (int i=;i<;i++)
{
v.x=u.x+dx[i];v.y=u.y+dy[i];
if (v.x<=||v.x>m||v.y<=||v.y>n) continue;
if (p^(d[u.x][u.y]&))
if (c[v.x][v.y]<=c[u.x][u.y]) t=;else t=;
else
if (c[v.x][v.y]>=c[u.x][u.y]) t=;else t=;
if (d[u.x][u.y]+t<d[v.x][v.y])
{
d[v.x][v.y]=d[u.x][u.y]+t;
if (!inq[v.x][v.y]){inq[v.x][v.y]=;tail=tail%M+;h[tail]=v;}
}
}
}
}
int dfs(int x,int lim)
{
for (int i=;i<=tot;i++)
if (bo[i]&&mp[x][i]<=lim)
{
bo[i]=;
if (!path[i]||dfs(path[i],lim))
{
path[i]=x;
return ;
}
}
return ;
}
int pd(int x)
{
int tmp=;
memset(path,,sizeof(path));
for (int i=;i<=(cnt<<);i++)
{
memset(bo,,sizeof(bo));
tmp+=(dfs(i,x));
}
return tmp+x>=(cnt<<);
}
int main()
{
scanf("%d%d%d%d",&m,&n,&cnt,&pt);
for (int i=;i<=(cnt<<|);i++)scanf("%d%d",&a[i].x,&a[i].y);
for (int i=;i<=pt;i++)
{
scanf("%d%d%d",&x,&y,&t);
while (t--){b[++tot].x=x;b[tot].y=y;}
}
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)scanf("%d",&c[i][j]);
for (int i=;i<=(cnt<<);i++)
{
if (i<=cnt) bfs(a[i].x,a[i].y,); else bfs(a[i].x,a[i].y,);
for (int j=;j<=tot;j++) mp[i][j]=d[b[j].x][b[j].y];
}
int l=,r=cnt<<;
while (l<r)
{
int mid=(l+r)>>;
if (pd(mid)) r=mid;
else l=mid+;
}
printf("%d\n",l);
return ;
}

bzoj2547的更多相关文章

  1. BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)

    先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...

  2. bzoj2547: [Ctsc2002]玩具兵

    划了一天水,其实我还是有点愧疚的. 传送门 其实是水题,然而我真是太蠢了... 首先不考虑天兵,其他兵要到一个点去一定是通过它-另一种兵-它……这样多次交换的,并且交换对象是无所谓的,和它换的兵最终会 ...

  3. [bzoj2547]玩具兵<Spfa+二分+匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2547 挺有意思的一道题,这道题可以划分成几个小题....... 题目大意: 三个兵种在一个 ...

随机推荐

  1. hadoop 一些命令

    关闭访问墙  service iptables stop hadoop dfs -mkdir input hadoop dfs -copyFromLocal conf/* input hadoop j ...

  2. oracle lpad 函数使用介绍

    函数介绍 lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下: lpad( string ...

  3. 2 安装企业wiki:confluence

    jira sudo /etc/init.d/jira start 启动 jiarsudo /etc/init.d/jira stop 停止 jiar 方法一:$ sudo /etc/init.d/co ...

  4. 漂亮的输出-----prettytable和colorama的使用

    Python通过prettytable模块将输出内容如表格方式整齐输出,python本身并不内置,需要独立安装该第三方库. 1 pip install PrettyTable 1 #源码安装 2 wg ...

  5. Linux上db2安装

    Linux上db2安装:https://blog.csdn.net/nayanminxing/article/details/69372283

  6. centos7 安装 gitolite (git服务器)

    gitolite简介 轻量级git服务器程序,解决了git权限管理的问题.(git是一个分布式版本控制系统,就是说每个人作为客户端的同时又是服务器)项目GitHub地址:https://github. ...

  7. 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)

    地址:https://open.weixin.qq.com/ 手册:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&am ...

  8. Java学习第三周摘要

    20145307<Java程序设计>第三周学习总结 教材学习内容总结 认识对象 类类型 Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.sun就是一个类类型变量,类 ...

  9. Metasploit安装——centos6.5

    1:安装ruby yum -y install ruby 2:根据官方文档执行,安装支持包  yum install xorg-x11-server-Xvfb -y 3:官网下载最新版的Metaspl ...

  10. windows使用Pandoc将Markdown转换为PDF文件

    pandoc下载:https://github.com/jgm/pandoc/releases/tag/1.19.2.1 //windows下载msi文件 miktex下载:https://mikte ...