[BZOJ 2547] 玩具兵
Link:
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] 玩具兵的更多相关文章
- [Bzoj 2547] [Ctsc2002] 玩具兵
2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 317 Solved: 152[Submit][Status] ...
- BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)
传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...
- bzoj 1010 玩具装箱toy -斜率优化
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具 ...
- [bzoj2547]玩具兵<Spfa+二分+匈牙利算法>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2547 挺有意思的一道题,这道题可以划分成几个小题....... 题目大意: 三个兵种在一个 ...
- BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- 【斜率DP】BZOJ 1010:玩具装箱
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7537 Solved: 2888[Submit][St ...
- BZOJ 1055 玩具取名
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使 ...
- BZOJ 1010: 玩具装箱toy (斜率优化dp)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)
先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...
随机推荐
- 抽象类和虚方法、base关键字
微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract ...
- Python课程设计 搭建博客
安装包Github地址 Python综合设计 233博客 注意还有个email文件是需要填入自己信息的,比如最高权限账号和要发送邮件的账号密码 请安装Python2.7环境,本服务器所用环境为 设置环 ...
- hadoop-eclipse环境搭建(二)
Eclipse插件配置 第一步:把我们的"hadoop-eclipse-plugin-1.0.0.jar"放到Eclipse的目录的"plugins"中,然后重 ...
- BETA(1)
目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...
- jQuery基础知识点(下)
在实际开发中,jQuery的实践性非常强大.上一篇本人已经整理出了一部分基础知识点,该文即是对以上的补充和扩展. 1.表单值的操作 //获取文本框的值 //txt.value var val = $( ...
- group_load,weight_load,group_capacity, group_weight大致都是啥数值
[ 113.180820] sgs->group_load:2039,sum_nr_running:2,sum_weighted_load:2039,sgs->group_capacity ...
- Android使用adb命令查看CPU信息
Android中使用JNI编程的时候会需要编译出不同的SO文件,以供适配不同的机型. 例如: 由此需要查看不同机型的CPU信息. 使用ADB命令查看CPU信息命令如下: 1. adb shell 2. ...
- BOZJ 2045:疯狂的馒头(并查集)
题目大意:有n个馒头排成一排,初始时颜色为0,进行m次染色,第i次将(i*p+q)mod n到(i*q+p)mod n的馒头全部染成颜色i,求最后所有馒头颜色.n<=10^6 m<=10^ ...
- BZOJ 3052: [wc2013]糖果公园 | 树上莫队
题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...
- spring in action 学习十一:property placeholder Xml方式实现避免注入外部属性硬代码化
这里用到了placeholder特有的一个语言或者将表达形式:${},spring in action 描述如下: In spring wiring ,placeholder values are p ...