[SDOI2015] 星际战争 题解
假如将所有激光武器放在一边,所有机器人放在一边,激光武器向它可以伤害的机器人连边,再加超级源/汇点,这就是一个网络流问题。
考虑激光武器向机器人连的边容量无限,而机器人向超级汇点连的边容量为机器人的装甲值,而超级源点连向激光武器的边则是用时 \(\times\) 激光武器伤害。
发现假如答案为 \(ans\),则所有大于 \(ans\) 的情况都可以击溃所有机器人,而用时小于 \(ans\) 则一定无法击溃所有机器人,发现单调性,二分用时,看最大流是否等于机器人装甲值之和。
时间复杂度 \(O((n+m)^2nm\log maxans)\),其中 \(maxans\) 是答案上界。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105,M=5505;
int n,m,s,t,h[N],d[N],c[N];
int k,to[M],nxt[M],e[N][N];
int w[M],a[N],b[N],sum;
void add(int x,int y,int z){
w[++k]=z;to[k]=y;
nxt[k]=h[x];h[x]=k;
nxt[++k]=h[y];
to[k]=x;h[y]=k;
}int bfs(){
memset(c,-1,sizeof(c));
queue<int>q;q.push(s);
c[s]=0;d[s]=h[s];
while(q.size()){
int x=q.front();q.pop();
for(int i=h[x];i;i=nxt[i]){
int y=to[i],lv=w[i];
if(lv>0&&c[y]==-1)
d[y]=h[y],c[y]=c[x]+1,q.push(y);
}
}return (c[t]==-1)?0:1;
}int dfs(int x,int ans){
if(x==t) return ans;
int now=ans;
for(int i=h[x];i&&now;i=nxt[i]){
int y=to[i];int lv=w[i];
if(lv<1||c[y]!=c[x]+1) continue;
int zjy=dfs(y,min(now,lv));
now-=zjy;w[i]-=zjy;w[i^1]+=zjy;
}return ans-now;
}int dinic(){
int ans=0;
while(bfs())
ans+=dfs(s,1e18);
return ans;
}int check(int x){
memset(h,0,sizeof(h));
memset(to,0,sizeof(to));
memset(w,0,sizeof(w));k=1;
memset(nxt,0,sizeof(nxt));
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(e[i][j]) add(i+n,j,1e18);
for(int i=1;i<=n;i++)
add(i,t,a[i]);
for(int i=1;i<=m;i++)
add(s,i+n,b[i]*x);
if(dinic()==sum) return 1;
return 0;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;t=n+m+1;
for(int i=1;i<=n;i++)
cin>>a[i],a[i]*=10000,sum+=a[i];
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>e[i][j];
int l=0,r=200000000,ans;
while(l<=r){
int mid=(l+r)/2;
if(check(mid))
ans=mid,r=mid-1;
else l=mid+1;
}printf("%.6lf",ans/1e4);
return 0;
}
[SDOI2015] 星际战争 题解的更多相关文章
- 洛谷P3324 [SDOI2015]星际战争 题解
题目链接: https://www.luogu.org/problemnew/show/P3324 分析: 因为本题的时间点较多,不能枚举,但发现有单调性,于是二分答案,二分使用的时间TTT 每个攻击 ...
- 3993: [SDOI2015]星际战争
3993: [SDOI2015]星际战争 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1244 Solved: ...
- 【BZOJ3993】[SDOI2015]星际战争 二分+最大流
[BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...
- bzoj3993: [SDOI2015]星际战争(网络流)
3993: [SDOI2015]星际战争 题目:传送门 题解: 洛谷AC了,但是因为bzoj的spj有问题所以暂时没A 一道老题目了,二分时间然后网络流判断. 每次st-->武器连时间*攻击力 ...
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...
- BZOJ_3993_[SDOI2015]星际战争_二分+网络流
BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...
- bzoj千题计划131:bzoj3993: [SDOI2015]星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...
- 洛谷P3324 [SDOI2015]星际战争
题目:洛谷P3324 [SDOI2015]星际战争 思路: 类似<导弹防御塔>,因为题目保证有解,花费时间小于最终答案时一定无法消灭所有敌人,只要花费时间大于等于最终答案都可以消灭所有敌人 ...
- 【题解】[SDOI2015]星际战争
\(\color{red}{Link}\) \(\text{Solution:}\) 观察到,如果一个时间\(T\)可以完成任务,则\(T+1\)这个时间也可以完成任务. 于是我们可以二分. 为了避免 ...
- 【BZOJ】3993: [SDOI2015]星际战争
题意 \(m\)个人\(n\)个物品,第\(i\)个物品生命值为\(A_i\),第\(i\)个人每秒可以减少一个物品\(B_i\)的生命值,给出一个\(m \times n\)的矩阵,如果\(i\)行 ...
随机推荐
- ELASTICSEARCH 读写性能优化
ELASTIC 写i性能优化 refresh translog flush refresh 优化 translog优化 flush 优化 读性能优化 shard 设置
- 李世铭SFE|销售的四种境界-与之匹配的CRM功能
销售有四种境界,与之匹配的也应有四种不同的CRM系统的功能. 1.服务型销售 这类销售代表人数最为众多,超过半数的销售代表皆属于服务型.他们主要基于客户的需求,来提供相应的解决方案,或者公司所规定的某 ...
- Winform窗体控件双向绑定数据模拟读写PLC数据
1.用Modbus工具模拟PLC 2.创建一个实体类 点击查看代码 internal class Data : INotifyPropertyChanged { ushort[] ushorts = ...
- 基于 .NET 的 Nuget 发版工具
背景 由于 Natasha 及周边项目发版任务多,文件结构也不简单,之前一直使用基于 Github 管道脚本和 XUnit 来发版.这个方案对于发版环境与条件依赖性较强,且不够灵活,因此萌生出做一个本 ...
- 录音虚拟驱动杂音bug修复
永远选择相信同步原语 起因 qemu有一个可以让虚拟机(guest)使用宿主机(host)的音频播放的参数,-device audio.这个参数在x86上效果不错,但是在arm上效果不行,杂音很多,所 ...
- docker-compose开机自启动设置
vi /etc/rc.d/rc.local /usr/local/bin/docker-compose -f /home/seafile/docker-compose.yml up -d 给rc.lo ...
- PM-数据治理中,常用的术语解释
1 指标 是表征和评价一项或多项经营活动业务绩效的指示.指标由指标名称和指标数值两部分组成,指标名称及其涵义体现指标在质和量方面的规定性,指标数值反映指标在具体对象在特定时间.空间.条件下的数量表现. ...
- 10C++选择结构(4)
一.switch语句 问题:风之巅小学规定,若测试成绩大于或等于90分为"A",大于或等于70分小于90分为"B",大于或等于60分小于70分为"C& ...
- 高中生入门学习c/c++指导
一.c与c++关系 参考图示: 可见,c与c++的基本部分是相同的,会有一些小区别,不妨一起学.DEV-C++能支持C++和C语言编程 二.学习资料网站介绍 1.C语言初阶--手把手教零基础/新手入门 ...
- Java 基于接口的动态代理
UserDao接口 package com.pry.cn; public interface UserDao { public int add(int a,int b); public String ...