[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玩具兵(最短路径+二分答案+最大流)
先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...
随机推荐
- Python 3基础教程11-如何利用pip命令安装包和模块
本文介绍如何利用pip命令安装Python相关的包和模块.在Python中有些方法或者模块是自带的功能,也叫(build-in),内构函数,实际使用,可能内构函数或者模块不能完成我们的任务,我们就需要 ...
- (原、整)BSP的江湖传说
@author:黑袍小道 查看随缘,当苦无妨,良人可归. 引言 为什么叫江湖传说,因为实现了第一人是卡马克,就这么简单.(不接受那啥) Quake3:http://www.mralligato ...
- rownum浅谈(一)
只要做web开发,几乎没有不需要分页查询的,在oracle中,rownum就是用来进行处理分页的. 1.rownum是oracle对结果集返回的一个伪列,也就是说是先查询完结果之后再加上的一个虚列,相 ...
- 团队项目-第九次scrum 会议
时间:11.5 时长:40分钟 地点:F楼1039教室 工作情况 团队成员 已完成任务 待完成任务 解小锐 完成员工commit函数的数值函数编写 完成多种招聘方式的逻辑编写 陈鑫 实现游戏的暂停功能 ...
- 微信小程序--动态添加class样式
尺寸单位: rpx(responsive pixel): 可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = ...
- realloc在aarch64_be-gcc的奇怪表现
最近遇到一个使用aarch64_be-gcc编译的ssh服务器出现不能通过ssh1协议使用密钥+passphrase不能正常登陆的问题. (⊙o⊙)…不要奇怪为啥还在用SSH1,我也在奇怪.. 一顿捣 ...
- URAL 1944 大水题模拟
D - Record of the Attack at the Orbit Time Limit:1000MS Memory Limit:65536KB 64bit IO Format ...
- A公司 推荐算法大赛 总结
一.介绍 ♦通过用户前四个月(04.15~08.15)的用户行为预测用户第五个月(08.15~09.15)将会购买的品牌.用户共有四种行为(type)分别是:点击(0).购买(1).购物车(2).收藏 ...
- YouTube高效传输策略:节省14%带宽 用户体验提升
视频平台会侦测用户端的带宽来调整码率及分辨率,但通常只考虑到编码器的比特率率--质量关联,忽略了用户的可用带宽影响.YouTube团队通过让视频流匹配用户带宽,不仅节省了带宽,还有效提升了用户主观体验 ...
- CodeForces 549H | 二分答案
参考了这个博客哇 #include<cstdio> #include<algorithm> #include<cstring> #define Max(a,b,c, ...