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面试题(练习三)

    1.MySQL索引种类 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 2.索引在什么情况下遵循最左前缀的规则? 最左前缀原理的一部分,索引index1:(a,b,c),只会走a ...

  2. JAVA相似算法的运用

    今天要处理问题是把一个产品的名字按照其内容对比文档转换出它的中文名. 但是这个文档感觉不全,产品种类有多又杂. 如果像这样写的话 if(xxx.contains()) else if() ... 不知 ...

  3. 【bzoj3444】最后的晚餐 并查集

    题目描述 n个人排成一排,有m个条件,第i个条件要求ai和bi相邻,求方案数. 输入 输入有m+1行,第一行有两个用空格隔开的正整数n.m,如题所示.接下来的m行,每一行有两个用空格隔开的正整数,第i ...

  4. 【GXZ的原创】平衡树性能测试

    本文作者为 GXZlegend ,转载请注明 出处 ,谢谢! 〇.序言 前些日子闲的蛋疼做了个平衡树性能测试... 主要是因为学会的平衡树越来越多,做题时却不知道写哪个... 本想结合效率和代码复杂度 ...

  5. redis cluster管理工具redis-trib.rb详解

    redis cluster管理工具redis-trib.rb详解 来源 http://weizijun.cn/2016/01/08/redis%20cluster%E7%AE%A1%E7%90%86% ...

  6. Codeforces 846D Monitor(简单二分+二维BIT)

    D. Monitor time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  7. pub/sub的实际应用总结

    pub/sub即观察者模式,有多重表现形式 1. Publisher/Subscriber2. Observer/Observable3. Listener(例如EventListener)4. Ev ...

  8. For Path

    /****** Script for SelectTopNRows command from SSMS ******/ DECLARE @table TABLE (姓名 VARCHAR(10),课程 ...

  9. poj 2186 强连通入门题目

    每头牛的梦想就是成为牛群中最受欢迎的牛. 在一群N(1 <= N <= 10,000)母牛中, 你可以得到M(1 <= M <= 50,000)有序的形式对(A,B),告诉你母 ...

  10. 无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上

    winxp系统,在使用boost中的thread中的sleep的时候出现“无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上”的错误, 1.在引用boost库之前( ...