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 ... 
随机推荐
- /bin  /usr/bin  /sbin  /usr/sbin 目录的作用
			/bin是系统的一些指令.bin为binary的简写主要放置一些系统的必备执行档例如:cat.cp.chmod df.dmesg.gzip.kill.ls.mkdir.more.mount.rm.su ... 
- opensuse 通过composer安装drush工具
			由于笔者的opensuse已安装好composer,所以按照官方网站的文章 Installing/Upgrading Drush on Ubuntu,使用composer形式安装drush工具. co ... 
- [记录]学习树莓派3B接DHT11和LCD1602和修改树莓派时区
			前提 树莓派系统安装好 apache web 服务器,如未安装,可在树莓派内执行sudo apt-get install apache2 进行安装apache 也可以通过命令获取GPIO信息: gpi ... 
- 关于安装了sqlite对于vs的组件,重启vs后,在外面可以连接sqlite数据库,但是在建立实体模型时没有sqlite数据源的问题
			出自:http://bbs.csdn.net/topics/390917337 兄弟,刚刚在stackoverflow上找到了解决方法了http://stackoverflow.com/questio ... 
- 关于join的一些补充
			1, 为什么join是string的method而不是list的method http://effbot.org/pyfaq/why-is-join-a-string-method-instead-o ... 
- 阿里云MaxCompute 2019-8月刊
			您好,MaxCompute 2019.8月刊为您带来8月产品.技术最新动态,欢迎阅读. 导读 [重要发布]8月产品重要发布 [文档更新]8月重要文档更新推荐 [干货精选]8月精选技术文章推荐 [精彩活 ... 
- csps模拟67神炎皇,降雷皇,幻魔皇题解
			题面:https://www.cnblogs.com/Juve/articles/11648975.html 神炎皇: 打表找规律?和$\phi$有关? 答案就是$\sum\limits_{i=2}^ ... 
- php结合phpStudy实例来熟悉CI框架,用的软件是phpStorm+phpStudy
			1.新建项目名字,我的是放在E盘,叫test,主要是包括application,system,index.php.我的控制器和视图不想放在application中,所以我新建了一个文件夹叫phpTes ... 
- UltraISO刻录CentOS 7安装指南
			CentOS 7.2 安装指南(U盘版) 一.准备阶段 1.下载CentOS7镜像文件(ISO文件)到自己电脑,官网下载路径: http://isoredirect.centos.org/centos ... 
- PHP面向对象魔术方法基本了解
			简单介绍 (1) 魔术方法都是系统提供,程序员使用即可. (2) 所有的魔术方法,前面都是以 __ 开头的 _是两个下划线. (3) 我们在自定义函数时,就不要使用 __开头了. (4) 魔术方法是 ... 
