传送门

解题思路

  可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换。刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了。。说说正解,首先可以发现交换士兵其实就是种类的交换,那么可以对于每一个点算出它距离所有点的距离,距离就是最少换几次,这个可以\(spfa\)求出,之后发现这个很像二分图匹配,可以二分答案表示用几次超能力,然后跑二分图匹配即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue> using namespace std;
const int N=105; inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,m,k,T,val[N][N],dis[N][N],xx[N],yy[N],match[N];
int h[N][N],tx[N],ty[N],dx[4]={0,1,0,-1},dy[4]={1,0,-1,0},ans,tot;
bool vis[N][N],use[N];
queue<int> Q[2]; void bfs(int x,int y,int tmp){
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dis[x][y]=0; vis[x][y]=1;
Q[0].push(x); Q[1].push(y);
int i,j,ii,jj,t;
while(Q[0].size()){
i=Q[0].front(); Q[0].pop();
j=Q[1].front(); Q[1].pop();
vis[i][j]=0;
for(int k=0;k<4;k++){
ii=i+dx[k]; jj=j+dy[k];
if(ii<1 || ii>n || jj<1 || jj>m) continue;
if((dis[i][j]&1)==tmp){
if(h[ii][jj]<h[i][j]) t=1;
else t=0;
}
else {
if(h[ii][jj]>h[i][j]) t=1;
else t=0;
}
if(dis[i][j]+t<dis[ii][jj]){
dis[ii][jj]=dis[i][j]+t;
if(!vis[ii][jj]) Q[0].push(ii),Q[1].push(jj),vis[ii][jj]=1;
}
}
}
} bool dfs(int x,int lim){
for(int i=1;i<=tot;i++){
if(val[x][i]>lim || use[i]) continue;
use[i]=1;
if(!match[i] || dfs(match[i],lim)) {
match[i]=x; return 1;
}
}
return 0;
} inline bool check(int lim){
int ret=0;
memset(match,0,sizeof(match));
for(int i=1;i<=2*k;i++){
memset(use,0,sizeof(use));
ret+=dfs(i,lim);
}
return ret+lim>=2*k;
} int main(){
n=rd(),m=rd(),k=rd(),T=rd(); int x,y,z;
for(int i=1;i<=2*k+1;i++) xx[i]=rd(),yy[i]=rd();
for(int i=1;i<=T;i++){
x=rd(),y=rd(),z=rd();
while(z--) tx[++tot]=x,ty[tot]=y;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) h[i][j]=rd();
for(int i=1;i<=2*k;i++){
if(i<=k) bfs(xx[i],yy[i],0);
else bfs(xx[i],yy[i],1);
for(int j=1;j<=tot;j++) val[i][j]=dis[tx[j]][ty[j]];
}
int l=0,r=(k<<1),mid;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}

BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)的更多相关文章

  1. [Bzoj 2547] [Ctsc2002] 玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 317  Solved: 152[Submit][Status] ...

  2. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]

    3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...

  3. BZOJ 4443 [Scoi2015]小凸玩矩阵(二分答案+二分图匹配)

    [题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=4443 [题目大意] 从矩阵中选出N个数,其中任意两个数字不能在同一行或同一列 求选出来的 ...

  4. 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)

    题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...

  5. noip 2010 关押罪犯 二分答案+二分图染色 || 并查集

    题目链接 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值&q ...

  6. POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)

    POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...

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

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

  8. [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

    题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...

  9. CF85E Guard Towers(二分答案+二分图)

    题意 已知 N 座塔的坐标,N≤5000 把它们分成两组,使得同组内的两座塔的曼哈顿距离最大值最小 在此前提下求出有多少种分组方案 mod 109+7 题解 二分答案 mid 曼哈顿距离 >mi ...

随机推荐

  1. 死锁(Deadlock)

    死锁:是指是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. ...

  2. 【SD系列】SAP 跨年时更改销售凭证号码段

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 跨年时更改销售凭证号码段   ...

  3. Win7 VS2019安装后创建C++工程失败解决

    VS2019正式上手,第1个问题创建不了工程,看起来非常类似之前VS2017更新 解决办法 https://github.com/Microsoft/msbuild/issues/4286 和上次的问 ...

  4. numpy.meshgrid的理解以及3D曲面图绘制(梯度下降法实现过程)

    相关概念: 1.x向量和y向量 import numpy as np import matplotlib.pyplot as plt x = np.array([[0,1,2,3], [0,0,0,0 ...

  5. "CoolShell puzzle game" writeup

    地址:http://fun.coolshell.cn/ Fuck your brain 看到一大串符号,还以为是 js 代码,结果放到 Chrome 控制台执行没有任何结果,然后搜了一下发现有一门叫B ...

  6. Assembly language 再读---续

    前面已经写到了第三章的数据类型 的那一部分 接下来是一些关于伪指令和其他杂七杂八的东西 1. 当前地址计数器:   $ 常用于  计算数组以及字符串的长度,如: .data list db ,,,,, ...

  7. JVM(15)之 类加载器

    开发十年,就只剩下这套架构体系了! >>>   今天我们将类加载机制5个阶段中的第一个阶段,加载,又叫做装载.为了便于阅读,以下都叫做装载.    装载的第一步就是要获得二进制的字节 ...

  8. React入门-JSX和虚拟dom

    1.JSX理解 举例: const element = <h1>Hello, world!</h1>; 这被称为 JSX,是一个 JavaScript 的语法扩展.建议在 Re ...

  9. Bootstrap-带语境色彩的面板

    使用语境状态类 panel-primary.panel-success.panel-info.panel-warning.panel-danger,来设置带语境色彩的面板,实例如           ...

  10. 20180105-Python中dict的使用方法

    字典是Python中常用的内置数据类型之一. 字典是无序的对象集合,只能通过key-value的方式存取数据,字典是一种映射类型,其次key的必须是可hash的不可变类型.字典中的key必须唯一. 1 ...