题面

传送门

思路

首先,有一个非常明显的模型:

将激光武器放到一边,机器人放到另一边,从每一个激光武器向它可以攻击的机器人连边,形成一个二分图

建立附加源点$ss$和附加汇点$tt$,$ss$连所有激光武器,$tt$连所有机器人,跑网络流算法

但是,问题在于这道题“武器的攻击是连续的”,也就是解是实数解

这使得我一开始想的费用流算法失效了

时间为实数,就说明我们不能把时间当成费用来看,那么该怎么办呢?

我们考虑把实数时间从费用的位置转到流量的位置去

但是流量在一开始就是确定的,最大流跑出来的结果只能用来判断是否是一个解

既然这样,我们就使用二分的方法,将最优化问题转化为判断性问题

二分时间t,每一次对于t,按照如下方式建边(以下用$\left(u,v,w\right)$表示u到v的流量为w的有向边)

对于每一个激光武器i,建边$\left(ss,i,B\left[i\right]\ast t\right)$

对于激光武器i可以攻击的机器人,建边$\left(i,j,inf\right)$

对于每一个机器人j,建边$\left(j,tt,A\left[j\right]\right)$

如果最大流流量等于所有机器人的生命之和,那么r=mid,否则l=mid+1

因为精度要求只有1e-3,所以把所有生命和时间都乘一个10000处理,要开long long

Code:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1e15
#define ll long long
using namespace std;
inline ll read(){
ll re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
ll n,m,cnt=-1,first[210],dep[210],cur[210];
struct edge{
ll to,next,w;
}a[100010];
void add(ll u,ll v,ll w){
a[++cnt]=(edge){v,first[u],w};first[u]=cnt;
a[++cnt]=(edge){u,first[v],0};first[v]=cnt;
}
bool bfs(ll s,ll t){
ll q[210],head=0,tail=1,i,u,v;
for(i=s;i<=t;i++) dep[i]=-1,cur[i]=first[i];
q[0]=s;dep[s]=0;
while(head<tail){
u=q[head++];
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(~dep[v]||!a[i].w) continue;
dep[v]=dep[u]+1;q[tail++]=v;
}
}
return ~dep[t];
}
ll dfs(ll u,ll t,ll limit){
if(u==t||!limit) return limit;
ll i,v,f,flow=0;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(dep[v]==dep[u]+1&&(f=dfs(v,t,min(limit,a[i].w)))){
a[i].w-=f;a[i^1].w+=f;
flow+=f;limit-=f;
if(!limit) return flow;
}
}
return flow;
}
ll dinic(ll s,ll t){
ll re=0;
while(bfs(s,t)) re+=dfs(s,t,inf);
return re;
}
bool x[60][60];ll hp[60],atk[60],sum=0;
void init(){
memset(first,-1,sizeof(first));memset(a,0,sizeof(a));cnt=-1;
}
void build(ll t){
ll ss=0,tt=n+m+1,i,j;
for(i=1;i<=m;i++) add(ss,i,t*atk[i]);
for(i=1;i<=n;i++) add(i+m,tt,hp[i]);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(x[i][j]) add(i,j+m,inf);
}
}
}
int main(){
n=read();m=read();ll i,j,le,ri,mid,ans;
for(i=1;i<=n;i++) hp[i]=read(),hp[i]*=10000ll,sum+=hp[i];
for(i=1;i<=m;i++) atk[i]=read();
for(i=1;i<=m;i++){
for(j=1;j<=n;j++) x[i][j]=read();
}
le=0;ri=100000000000ll;
while(le<ri){
mid=(le+ri)>>1ll;
init();
build(mid);
ans=dinic(0,n+m+1);
if(ans<sum) le=mid+1;
else ri=mid;
}
printf("%.4lf",(double)le/10000.0);
}

[SDOI2015][bzoj3993] 星际战争 [二分+最大流]的更多相关文章

  1. 【BZOJ3993】[SDOI2015]星际战争 二分+最大流

    [BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...

  2. [bzoj3993][SDOI2015]星际战争-二分+最大流

    Brief Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai. ...

  3. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]

    3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...

  4. bzoj 3993 星际战争 - 二分答案 - 最大流

    3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值减少到0或者 ...

  5. 【LOJ】#2184. 「SDOI2015」星际战争

    题解 直接二分然后建图跑网络流看看是否合法即可 就是源点向每个激光武器连一条二分到的时间×激光武器每秒攻击值的边 每个激光武器向能攻击的装甲连一条边 每个装甲向汇点连一条装甲值的边 代码 #inclu ...

  6. BZOJ_3993_[SDOI2015]星际战争_二分+网络流

    BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...

  7. bzoj千题计划131:bzoj3993: [SDOI2015]星际战争

    http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...

  8. 【BZOJ3993】星际战争(网络流,二分答案)

    [BZOJ3993]星际战争(网络流,二分答案) 题面 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团 ...

  9. bzoj3993: [SDOI2015]星际战争(网络流)

    3993: [SDOI2015]星际战争 题目:传送门 题解: 洛谷AC了,但是因为bzoj的spj有问题所以暂时没A 一道老题目了,二分时间然后网络流判断. 每次st-->武器连时间*攻击力 ...

随机推荐

  1. 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告

    点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...

  2. linux 硬链接与软链接的区别

      硬链接的特点:不添加新文件 不能跨区建立 不能对目录建立 删除源文件硬链接正常访问   ln 源文件 目标链接文件   软连接的特点:会添加新文件 可以跨区建立 可以对目录建立 删除源文件软连接不 ...

  3. Softmax回归(Softmax Regression

    多分类问题 在一个多分类问题中,因变量y有k个取值,即.例如在邮件分类问题中,我们要把邮件分为垃圾邮件.个人邮件.工作邮件3类,目标值y是一个有3个取值的离散值.这是一个多分类问题,二分类模型在这里不 ...

  4. 前端异常日志监控 - 使用Sentry

    背景 现在的前端项目越来越复杂,在不同的客户端会产生各种在开发人员机器上不会出现的问题.当用户报告一个问题给开发人员的时候,开发人员无法直接定位问题.在此前,听过一次鹅厂的前端人员,他们对QQ里面的网 ...

  5. Vue源码学习一 ———— Vue项目目录

    Vue 目录结构 可以在 github 上通过这款 Chrome 插件 octotree 查看Vue的文件目录.也可以克隆到本地.. Vue 是如何规划目录的 scripts ------------ ...

  6. webpack 4.x 解决 webpack-dev-server工具在webpack构建的项目中使用问题

    webpack-dev-server工具能实现自动打包编译和热更新 首先将webpack-dev-server安装到项目中 npm install webpack-dev-server -D 这时在命 ...

  7. 二、Linux 系统启动过程

    Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 ...

  8. Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本

    Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...

  9. 华为liteos了解(一)

    我来补充一下,从@華仔答案的提供的wiki中看,随便翻了一下,内核部分和协议栈的接口部分代码风格完全不一致.协议栈和相关的代码应该是直接使用或者修改了uIP (micro IP)的实现,所以整体感觉应 ...

  10. [BZOJ2947]促销(Splay)

    Description Great Bytelandish的超级市场网络请你编写一个程序模拟促销商品的成本费用(simulating costs of the promotionbeing prepa ...