bzoj2547: [Ctsc2002]玩具兵
划了一天水,其实我还是有点愧疚的。
其实是水题,然而我真是太蠢了。。。
首先不考虑天兵,其他兵要到一个点去一定是通过它-另一种兵-它……这样多次交换的,并且交换对象是无所谓的,和它换的兵最终会是在原位置。
而且骑兵和步兵的数量相等,就不存在一个兵找不到人跟它换的情况,那么一个确定的方案下换的次数最多的兵换的次数就是答案。
先spfa找出每个兵到每个位置的最小换的次数,然后二分答案,把每个兵向它可以到的地方连边,跑最大匹配,考虑到还有天兵,而天兵是可以一步登天的超神存在,所以如果最大匹配数+现在check的ans>=总兵数即OK。
因为一直在划水,断断续续地写这个代码 ,又困得要命,仿佛活在梦中,结果竟然1A了,神奇。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
const int N=;
typedef long long LL;
using namespace std;
int n,m,k,t,R[N],h[N][N],dis[N][N],dp[N][N][],vis[N][N][];
int dx[]={,,,-},dy[]={,-,,}; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int x,y,o;
node(){}
node(int x,int y,int o):x(x),y(y),o(o){}
}b[N],p[N]; queue<node>que;
void spfa(int sx,int sy,int k) {
memset(dp,,sizeof(dp));
if(k) dp[sx][sy][]=,que.push(node(sx,sy,));
else dp[sx][sy][]=,que.push(node(sx,sy,));
while(!que.empty()) {
node now=que.front();
que.pop();
int x=now.x,y=now.y,o=now.o;
vis[x][y][o]=;
for(int i=;i<;i++) {
int xx=now.x+dx[i],yy=now.y+dy[i],oo,t;
if(xx>=&&xx<=n&&yy>=&&yy<=m) {
if((o==&&h[xx][yy]>=h[x][y])||(o==&&h[xx][yy]<=h[x][y])) t=dp[x][y][o],oo=o;
else t=dp[x][y][o]+,oo=o^;
if(dp[xx][yy][oo]>t) {
dp[xx][yy][oo]=t;
if(!vis[xx][yy][oo]) {
que.push(node(xx,yy,oo));
vis[xx][yy][oo]=;
}
}
}
}
}
} int ok[N][N],vs[N],pr[N],sum[N];
int find(int x) {
for(int i=;i<=*k;i++) if(ok[x][i]&&!vs[i]) {
vs[i]=;
if(!pr[i]||find(pr[i])) {
pr[i]=x;
return ;
}
}
return ;
} int ck(int ans) {
int res=;
for(int i=;i<=*k;i++)
for(int j=;j<=t;j++) {
if(dis[i][j]<=ans)
for(int kk=;kk<=R[j];kk++)
ok[i][sum[j-]+kk]=;
else for(int kk=;kk<=R[j];kk++)
ok[i][sum[j-]+kk]=;
}
memset(pr,,sizeof(pr));
for(int i=;i<=*k;i++) {
memset(vs,,sizeof(vs));
if(find(i)) res++;
}
if(res+ans>=*k) return ;
else return ;
} int main() {
read(n); read(m); read(k); read(t);
for(int i=;i<=*k+;i++) {
read(b[i].x);
read(b[i].y);
}
for(int i=;i<=t;i++) {
read(p[i].x);
read(p[i].y);
read(R[i]); sum[i]=sum[i-]+R[i];
}
for(int i=;i<=n;i++) for(int j=;j<=m;j++) read(h[i][j]);
memset(dis,,sizeof(dis));
for(int i=;i<=*k;i++) {
spfa(b[i].x,b[i].y,(i<=k));
for(int j=;j<=t;j++)
dis[i][j]=min(dp[p[j].x][p[j].y][],dp[p[j].x][p[j].y][]);
}
if(ck()) {
puts(""); return ;
}
int l=,r=1e9,ans=r;
while(l<=r) {
int mid=((l+r)>>);
if(ck(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
return ;
}
/*
4 6 2 5
1 1 1 5 4 1 4 5 3 3
1 2 1 2 6 1 3 2 1 3 6 1 4 3 1
3 2 6 1 3 5
2 1 7 4 4 6
2 3 1 4 3 4
4 3 4 3 2 3
*/
bzoj2547: [Ctsc2002]玩具兵的更多相关文章
- BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)
先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...
- [Bzoj 2547] [Ctsc2002] 玩具兵
2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 317 Solved: 152[Submit][Status] ...
- BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)
传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...
- [bzoj2547]玩具兵<Spfa+二分+匈牙利算法>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2547 挺有意思的一道题,这道题可以划分成几个小题....... 题目大意: 三个兵种在一个 ...
- [BZOJ 2547] 玩具兵
Link: BZOJ 2547 传送门 Solution: 很容易通过解可行性的单调性想到二分答案,接下来考虑如何验证解 发现一个很奇妙的条件:步兵和骑兵的个数相同 因此交换位置时不用考虑可行性,保证 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
- DNF NPK包名对照一览表
文章转载自:http://bbs.exrpg.com/thread-107917-1-1.html ┌ sprite.NPK ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
随机推荐
- visual studio 2017--括号自动补全
---恢复内容开始--- 平常在visual studio中编写C++代码,一般括号之类的都是自动补全的,最近想用来编写Python,发现括号不能补全了,很不适应. Python编写时好像括号好像默认 ...
- ASP.NET WEB API 特性路由
一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...
- 【学术篇】luogu1558&&poj2777 色板游戏
题目の传送门: luogu:https://www.luogu.org/problem/show?pid=1558 poj:http://poj.org/problem?id=2777 题目大意:给有 ...
- 异常处理记录: Unable to compile class for JSP
出错信息截图: 经过搜索引擎的帮助, 发现这些引发异常的可能原因: 1. tomcat的版本必须大于等于JDK的版本 2. maven中的jar与tomcat中jar冲突 看看pom.xml, 果然j ...
- data hazard in CPU pipeline
1, background info 5 stages in CPU pipeline: IF, ID, EX, MM, WB IF – Instruction Fetch ID – Instruct ...
- Error configuring application listener of class [org.springframework.web.util.Log4jConfigListener]
1.启动项目发现如下错误: 严重: Error configuring application listener of class [org.springframework.web.util.Log4 ...
- Installer - 使用Maven自动布署至外部Tomcat
一.配置相关文件 1.配置tomcat的conf/tomcat-users.xml文件 <tomcat-users> <role rolename="manager-scr ...
- eclipse快捷大全
Eclipse常用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索 ...
- 服务器迁移部署OmsEdi
基本配置 绑定 高级设置
- centos7 安装 python3
sudo yum -y groupinstall "Development tools" sudo yum -y install zlib-devel bzip2-devel op ...