Link:

BZOJ 2547 传送门

Solution:

很容易通过解可行性的单调性想到二分答案,接下来考虑如何验证解

发现一个很奇妙的条件:步兵和骑兵的个数相同

因此交换位置时不用考虑可行性,保证能完成交换(口胡证明一下就行了)

于是可以将每一次交换位置想成转变职业(不用考虑能否交换)

每一个士兵先用$bfs$预处理其到每个格子需要的转变次数。

对于一次$check(mid)$,由于上述性质,$交换次数<=mid$的移动都是合法的

只要先跑一遍$交换次数<=mid$的士兵和位置的最大匹配$Max_{Match}$

再考虑$Max_{Match}+mid>=2*K$是否成立即可(多出的贡献$mid$是对于“天兵”的特殊处理)

Code:

#include <bits/stdc++.h>

using namespace std;
typedef pair<int,int> P;
#define X first
#define Y second
const int MAXN=1e3+;
int dx[]={,,,-},dy[]={,-,,};
P dat[MAXN],ly[MAXN];
int N,M,K,T,h[MAXN][MAXN],tot=;
int match[MAXN],dist[MAXN][MAXN],w[MAXN][MAXN];
bool vis[MAXN]; void bfs(int st_x,int st_y,int f)
{
queue<P> que;que.push(P(st_x,st_y));
memset(dist,0x3f,sizeof(dist));dist[st_x][st_y]=;
while(!que.empty())
{
P t=que.front();que.pop();
for(int i=;i<;i++)
{
int fx=t.X+dx[i],fy=t.Y+dy[i],delta;
if(fx< || fx>N || fy< || fy>M) continue;
if(f^(dist[t.X][t.Y]&))
if(h[fx][fy]<=h[t.X][t.Y]) delta=; else delta=;
else
if(h[fx][fy]>=h[t.X][t.Y]) delta=; else delta=;
if(dist[fx][fy]>dist[t.X][t.Y]+delta)
{
dist[fx][fy]=dist[t.X][t.Y]+delta;
que.push(P(fx,fy));
}
}
}
} bool dfs(int u,int lim)
{
for(int i=;i<=tot;i++)
if(!vis[i] && w[u][i]<=lim)
{
vis[i]=true;
if(match[i]==- || dfs(match[i],lim))
{
match[i]=u;
return true;
}
}
return false;
} bool check(int x)
{
memset(match,-,sizeof(match));
int ret=;
for(int i=;i<=*K;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i,x)) ret++;
}
return (ret+x)>=*K;
} int main()
{
scanf("%d%d%d%d",&N,&M,&K,&T);
for(int i=;i<=*K+;i++) scanf("%d%d",&dat[i].X,&dat[i].Y);
for(int i=;i<=T;i++)
{
int x,y,z;scanf("%d%d%d",&x,&y,&z);
while(z--) ly[++tot]=P(x,y);
}
for(int i=;i<=N;i++) for(int j=;j<=M;j++) scanf("%d",&h[i][j]); for(int i=;i<=*K;i++) //bfs预处理
{
if(i<=K) bfs(dat[i].X,dat[i].Y,);
else bfs(dat[i].X,dat[i].Y,);
for(int j=;j<=tot;j++) w[i][j]=dist[ly[j].X][ly[j].Y];
} int l=,r=K*; //二分答案
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)) r=mid-;
else l=mid+;
}
printf("%d",l);
return ;
}

Review:

此题的难点在于将 交换位置$->$转变职业

还是要注意题目中的特殊性质(EX:两职业个数相同),看看能不能推出一些奇妙的结论

[BZOJ 2547] 玩具兵的更多相关文章

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

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

  2. BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)

    传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...

  3. bzoj 1010 玩具装箱toy -斜率优化

    P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具 ...

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

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

  5. BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  6. 【斜率DP】BZOJ 1010:玩具装箱

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7537  Solved: 2888[Submit][St ...

  7. BZOJ 1055 玩具取名

    Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使 ...

  8. BZOJ 1010: 玩具装箱toy (斜率优化dp)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

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

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

随机推荐

  1. 【Python-遇到的Error】AttributeError: 'str' object has no attribute 'input_text'

    学习类的实例化的时候遇到了AttributeError: 'str' object has no attribute 'input_text', 以下是报错的代码及修改正确的代码. class shu ...

  2. [转]unity之LOD

    LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型. 它的好处是可以在适当的时候大量减少需要绘制的顶点数目. 它的缺点 ...

  3. 斐波那契数列的三种C++实现及时间复杂度分析

    本文介绍了斐波那契数列的三种C++实现并详细地分析了时间复杂度. 斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1) + F(n-2) (n>2) 如何计算斐波那契数 F( ...

  4. ImportError: dynamic module does not define module export function (PyInit__caffe)

    使用python3运行caffe,报了该错误. 参考网址:https://stackoverflow.com/questions/34295136/importerror-dynamic-module ...

  5. MVC从Controller到view进行传值的方法

    这几天基本上都是交接的一些杂事,没有什么工作任务,就有空来回顾一下MVC.虽然工作中也用到了MVC,但已经被微软的架构师设计的找不到MVC的影子了,可能有别的考虑吧,至今还没研究出来.所以,今天就来回 ...

  6. POJ 1061 青蛙的约会 | 同余方程和exGcd

    题解: 要求s+px=t+qx (mod L) 移项 (p-q)x=t-s (mod L) 等价于 (p-q)x+Ly=t-s 即ax+by=c的方程最小非负根 exGcd后乘个C #include& ...

  7. NOIP2017赛前考试注意事项总结

     考前: 考试前把读入优化和库以及对拍文件打好做好准备工作,另外注意放松心态,太紧张了肯定考不好··将自己的注意力集中起来  考场策略: 考试的基本策略是对每于道题先想个20分钟,如果想不出个靠谱的方 ...

  8. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  9. [1]区分event对象中的[clientX,offsetX,screenX,pageX]

    前言 在平时的开发中,非常讨厌的就是兼容性了,兼容性的问题总会让我们记忆混淆,所以这次来区分一下event对象中的常用获取鼠标位置. clientX clientY event.clientXeven ...

  10. centos dhcp获取不到ip解决方法 Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization.

    1.删除文件: /etc/udev/rules.d/70-persistent-net.rules 2.编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 删除H ...