题解:

二分+宽搜+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. Windows资源监控神器——perfmon

    一.简述 笔者在用lr中control监控Windows资源的时候,有时候总是遇到卡死和报错,所以就发现了Windows自带的监控神器————perfmon. Perfmon提供了图表化的系统性能实时 ...

  2. java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 异常处理,及MySQL数据库编码设置

    java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,C ...

  3. Ubuntu安装samba实现文件夹共享

    因工作需要,准备在Ubuntu服务器上共享文件夹,从Windows和Mac上都可以访问共享文件. 搜了一下,决定通过samba服务实现.安装过程如下: [step1]安装samba服务 sudo ap ...

  4. C++之条形码,windows下zint库的编译及应用(一)

    zint库是一个开源的第三方库,提供了生成条形码.二维码等功能.本文主要介绍zint库的生成及简单应用. 工具/原料   vs2012 代码文件下载   1 下载zint包 2 zint依赖另外两个库 ...

  5. 获取浏览器版本型号(C#)

    private string GetClientBrowserVersions() { string browserVersions = string.Empty; HttpBrowserCapabi ...

  6. igraph Tutorial

      igraph Tutorial¶   参考http://www.cs.rhul.ac.uk/home/tamas/development/igraph/tutorial/tutorial.html ...

  7. Codeforces 235C. Cyclical Quest

    传送门 写的时候挺蛋疼的. 刚开始的时候思路没跑偏,无非就是建个SAM然后把串开两倍然后在SAM上跑完后统计贡献.但是卡在第二个样例上就是没考虑相同的情况. 然后开始乱搞,发现会出现相同串的只有可能是 ...

  8. [P1860]新魔法药水

    题目描述 商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? 输入输出格式 输入格式: 第一行四 ...

  9. .Net Core Cookie跨站点共享 会话保持

    这里使用简单粗暴的方式,只为做个记录. 关键配置: services.AddDataProtection() .SetApplicationName("appname") .Dis ...

  10. 你不知道的东西! c# == 等于运算符 和 Object.Equals()

    最近在看 高级点的程序员必看的     CLR via C#    书中说解释了 Object.Equals()  方法的实现, 其中具体的实现用的是 == 运算符 ! 以前就对 == 运算符 的具体 ...