这个题我们把三个单位分开讨论

骑兵和步兵:由于一次超能力可以随便换任意次,容易想到对于一个步兵来说走到第 iii 个点其使用超能力的次数应该是一个最短路问题,从 (x1,y1)(x_1,y_1)(x1​,y1​) 走到 (x2,y2)(x_2,y_2)(x2​,y2​) 若 hx1,y1<hx2,y2h_{x_1,y_1}<h_{x_2,y_2}hx1​,y1​​<hx2​,y2​​ 则边权为 111(随便找个骑兵超能力一下),否则边权为 000。骑兵同理。

天兵:妥妥的工具人,由于对非超能力移动不做限制,天兵可以满图乱跑,跑到目标点再超能力一下把一个步兵或骑兵换过来,然后去下一个点。

然后就是,由于要求套路的二分答案超能力的次数,假如说第 iii 个兵到 第 jjj 个目标点所用超能力次数大于二分的这个值就不用管(你也管不了不是),那么剩下的这些信息就是可以到的了,我们希望在不使用天兵的情况下尽可能多的让其它兵种上点,显然的我们跑一次二分图最大匹配即可(注意:一个目标点最多可以有 rir_iri​ 个兵在那里,遇到这种无法用常规方法处理的东西要拆点,我们把一个目标点拆成 rir_iri​ 个目标点再跑最大匹配,最短路的时候需要注意是跑原先的图,再用到第 iii 个点的最短路去更新这拆出的 rir_iri​ 个点)。

然后剩下这些没匹配上的兵,我们只能用天兵去传送,这个时候点的限制就无意义了,天兵可以随便飞。这样我们使用超能力的次数为 2k−ans2k-ans2k−ans (ansansans 表示最大匹配数),再把这个值跟 midmidmid 比较即可。

代码(比较丑,仅供对拍)

#include<bits/stdc++.h>
using namespace std;
int n,m,k,t,s,vis[2005][2005],dis[2005][2005],h[505][505],d[2005][2005],tot;
int ssh(int x,int y){return (x-1)*m+y;
}
vector<int>G[200];
struct troop{int num,x,y;
}tp[206],re[206],R[206];
struct node{int x,y;
};
struct qqq{int y,next;int used;
}a[5001],fc[500];
const int dx[]={-1,1,0,0};
const int dy[]={0,0,1,-1};
void BFS(int sx,int sy,bool M){queue<node>q;memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));dis[sx][sy]=0;q.push((node){sx,sy});while(!q.empty()){node top=q.front();q.pop();vis[top.x][top.y]=0;for(int i=0;i<4;i++){int ex=top.x+dx[i];int ey=top.y+dy[i];if(ex<1||ex>n||ey<1||ey>m)continue;int ds=0;int tmp=((dis[top.x][top.y]&1)^M);if(h[ex][ey]>h[top.x][top.y]&&tmp){ds=1;}if((h[ex][ey]<h[top.x][top.y]&&!tmp)){ds=1;}if(dis[top.x][top.y]+ds<dis[ex][ey]){dis[ex][ey]=dis[top.x][top.y]+ds;if(!vis[ex][ey]){ q.push((node){ex,ey});vis[ex][ey]=1;}}}}
}
int match[200],vs[200];
int dfs(int u){for(int i=0;i<G[u].size();i++){int y=G[u][i];if(!vs[y]){vs[y]=1;if(!match[y]||dfs(match[y])){match[y]=u;return 1;               }}}return 0;
}
bool check(int mid){for(int i=0;i<=2*k;i++){G[i].clear();}memset(match,0,sizeof(match));for(int i=1;i<=2*k;i++){for(int j=1;j<=tot;j++){if(d[i][j]<=mid){//add(i,j);G[i].push_back(j);} }}int ans=0;for(int i=1;i<=2*k;i++){memset(vs,0,sizeof(vs));ans+=dfs(i);}return ans+mid>=2*k;}
int main()
{ios::sync_with_stdio(0);cin>>n>>m>>k>>t;tot=0;for(int i=1;i<=2*k+1;i++){cin>>tp[i].x>>tp[i].y;}for(int i=1;i<=t;i++){cin>>re[i].x>>re[i].y>>re[i].num;while(re[i].num--){R[++tot].x=re[i].x;R[tot].y=re[i].y;}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>h[i][j];}}for(int i=1;i<=2*k;i++){BFS(tp[i].x,tp[i].y,i>k);for(int j=1;j<=tot;j++){d[i][j]=dis[R[j].x][R[j].y];}   }int L=0,rR=2*k;while(L<rR){int mid=(L+rR)/2;if(check(mid))rR=mid;elseL=mid+1;} cout<<L<<endl;return 0;
}

题解 [CTSC2002]玩具兵相关推荐

  1. bzoj 2547: [Ctsc2002]玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec   Memory Limit: 128 MB Submit: 351   Solved: 169 [ Submit][ S ...

  2. bzoj2547 [Ctsc2002]玩具兵 dp+二分匹配

    先手玩几个小结论: 1.步兵一定和骑兵换→走的路径可转化为步兵路径+骑兵路径+步兵路径+...可匹配点 所以相当于求k*2个点到另外2*k个点的最小换次花费,这个用类似spfa的dp可搞 然后天兵只有 ...

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

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

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

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

  5. PA10题解报告——玩具(Toy)

    数据结构与算法实验2020夏第二批(中国石油大学) PA10题解报告--玩具(Toy) 目录 题目描述 题目分析 编码实现 一.题目描述 1. 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时 ...

  6. BZOJ 2547(匈牙利算法-任意边的处理)

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec   Memory Limit: 128 MB Submit: 104   Solved: 50 [ Submit][ St ...

  7. [literature]地下铁文本

    "天使在地下铁入口跟我说再见的那一年,我渐渐看不见了.15岁生日的秋天早晨,窗外下着毛毛雨,我喂好我的猫,六点零五分,我走进地下铁."翻开几米的<地下铁>,你可以发现绮 ...

  8. 机器人暮色枪骑皮肤_LOL:双11活动来了,38款SN总决赛精选阵容半价皮肤推荐

    双11活动来了,不是全场半价,是部分精选半价以及限定皮肤返场,消息各位也都知道了不多说,咱们直接说推荐,活动时间是11月11日10:00才开始,所以还有好几天时间,这就不用着急了,慢慢来做一些推荐! ...

  9. 音乐计算机研修心得,音乐教师研修总结报告

    [www.cddlwy.com--总结] 总结报告是会议领导同志对会议召开的情况和会议所取得的成果进行总结的陈述性文件.以下是本站分享的音乐教师研修总结报告,希望能帮助到大家! 音乐教师研修总结报告 ...

最新文章

  1. .NET开源工作流驰ccflow从表数据数据源导入设置
  2. Linux 下安装配置C/C++开发环境 Code::Blocks
  3. me shy是什么歌 抖音make_内含活动福利 | 小红书、抖音爆赞的高颜值的北欧家居神店开到卜蜂中心啦!...
  4. WebService初入
  5. java date只保留年月日_java.util.Date、java.sql.Date、java.sql.Timestamp区别和总结
  6. matlab pde工具箱解最优化控制,MATLAB PDE工具箱在半导体器件中的应用研究
  7. Why String is Immutable or Final in Java
  8. G盘文件系统RAW要怎么办啊
  9. Maven中配置redis时有红色感叹号
  10. Mybaits 3.2.6设计的一个缺陷,欢迎拍砖交流
  11. Flink 流批一体在阿里的落地
  12. 图像像素点赋值_OpenCV学习笔记(二)之图像阈值化
  13. sqlserver2008彻底卸载
  14. 小白量化彩票实战(5)彩票号码快速生成组合及利用数据库生成彩票号码组合
  15. mfc 定时器绘制旋转六边形_OpenGL——旋转的六边形(动画)
  16. 关于iOS系统你知道多少???
  17. 二项式系数(枚举+二分+二项式定理)
  18. 简单的汇率转换工具---初试AJAX
  19. GBase 8a的SNMP Trap 告警
  20. 上位机plc编程入门_【新手入门】西门子PLC编程入门学习

热门文章

  1. 再领高校前沿科技风潮,微众银行第三届金融科技大赛落下帷幕
  2. 【MATLAB】导入excel数据并用命令行窗口绘图
  3. 轻装上阵,微盟迈向智慧零售的春天
  4. 8710系列的BW14模组,共模体型
  5. fluent算例6 使用UDF定义沸腾与冷凝
  6. 利用快速瞬变负载测试DC /DC转换器简记1
  7. pub格式文件如何打开
  8. 企业VI设计中企业招牌的设计
  9. Springboot毕设项目消防安全知识普及平台9rv4qjava+VUE+Mybatis+Maven+Mysql+sprnig)
  10. java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMake