划了一天水,其实我还是有点愧疚的。

传送门

其实是水题,然而我真是太蠢了。。。

首先不考虑天兵,其他兵要到一个点去一定是通过它-另一种兵-它……这样多次交换的,并且交换对象是无所谓的,和它换的兵最终会是在原位置。

而且骑兵和步兵的数量相等,就不存在一个兵找不到人跟它换的情况,那么一个确定的方案下换的次数最多的兵换的次数就是答案。

先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]玩具兵的更多相关文章

  1. BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)

    先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...

  2. [Bzoj 2547] [Ctsc2002] 玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 317  Solved: 152[Submit][Status] ...

  3. BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)

    传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...

  4. [bzoj2547]玩具兵<Spfa+二分+匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2547 挺有意思的一道题,这道题可以划分成几个小题....... 题目大意: 三个兵种在一个 ...

  5. [BZOJ 2547] 玩具兵

    Link: BZOJ 2547 传送门 Solution: 很容易通过解可行性的单调性想到二分答案,接下来考虑如何验证解 发现一个很奇妙的条件:步兵和骑兵的个数相同 因此交换位置时不用考虑可行性,保证 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  8. DNF NPK包名对照一览表

    文章转载自:http://bbs.exrpg.com/thread-107917-1-1.html ┌ sprite.NPK                                      ...

  9. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

随机推荐

  1. selenium学习笔记——driver.get(url) 页面加载时间太长

    # 两个同时设置才行 # 实现效果:加载状态停止,进行代码下一步操作 driver.set_page_load_timeout(10) driver.set_script_timeout(10) # ...

  2. 手把手教你接口自动化测试 – SoapUI & Groovy【转】

    手把手教你接口自动化测试 – SoapUI & Groovy Posted on 2015-01-21 09:38 WadeXu 阅读(12741) 评论(10) 编辑 收藏 手把手教你接口自 ...

  3. ActiveMQ 传输协议

    配置 ActiveMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内. 配置示例 TCP(默认协议,性能相对可靠) Transmissi ...

  4. DataV教你如何给可视化应用一键美颜

    视频观看地址:https://yunqivedio.alicdn.com/user-upload/T4WEb4C5Fc.mp4 如果你平时经常接触数据统计.数据展示和决策分析,相信你对DataV一定有 ...

  5. Python-面向对象之封装与多态

    目录 组合 什么是组合 使用组合的目的 如何使用组合 封装 什么是封装 为什么要封装 如何封装 访问限制机制 什么是访问限制机制 访问限制机制的目的 如何使用访问限制 property 什么是prop ...

  6. 记录下sparkStream的做法(scala)

    一直用storm做实时流的开发,之前系统学过spark但是一直没做个模版出来用,国庆节有时间准备做个sparkStream的模板用来防止以后公司要用.(功能模拟华为日常需求,db入库hadoop环境) ...

  7. NoSQL与关系数据库的比较

  8. HBase Master-status

  9. 打开springboot的run dashboard

    默认情况下,idea的run dashboard是关闭的,当检测到你有多个springboot项目时会弹出提示框,询问是否打开. 如果我们想要自己打开,需要修改配置. 在你的idea的项目目录中,有一 ...

  10. leyou_01_自定义异常处理器

    1.自定义异常处理器,当程序发生异常时可以我们可以自己定义返回的,状态码和状态信息 2.当异常发生时调用我们的自定义异常 @RestController @RequestMapping("i ...