BZOJ3993: [SDOI2015]星际战争
BZOJ3993: [SDOI2015]星际战争
Description
3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战。在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai。当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机器人就被摧毁了。X军团有M个激光武器,其中第i个激光武器每秒可以削减一个巨型机器人Bi的装甲值。激光武器的攻击是连续的。这种激光武器非常奇怪,一个激光武器只能攻击一些特定的敌人。Y军团看到自己的巨型机器人被X军团一个一个消灭,他们急需下达更多的指令。为了这个目标,Y军团需要知道X军团最少需要用多长时间才能将Y军团的所有巨型机器人摧毁。但是他们不会计算这个问题,因此向你求助。
Input
第一行,两个整数,N、M。
Output
一行,一个实数,表示X军团要摧毁Y军团的所有巨型机器人最少需要的时间。输出结果与标准答案的绝对误差不超过10-3即视为正确。
Sample Input
3 10
4 6
0 1
1 1
Sample Output
HINT
【样例说明1】
题解Here!
从$S$到每一个武器$i$连一条边,容量为$B_i\times t$。
从每一个机器人$i+m$向$T$连一条边,容量为$A_i$。
从每个武器向所有能攻击的机器人连一条边,容量为$MAX$。
然后就可以跑了。
对于精度问题,注意到这题的精度要求并不是很高。
可以不用$double$二分及计算,把所有的流量全部乘以$10000$即可。
记得开$long\ long$。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 60
#define MAX (1LL<<62)
using namespace std;
int n,m,c=2,s,t;
long long sum=0,blood[MAXN],attack[MAXN];
bool edge[MAXN][MAXN];
int head[MAXN<<1],deep[MAXN<<1];
struct node{int next,to;long long w;
}a[MAXN*MAXN<<1];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline void add(int u,int v,long long w){a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;a[c].to=u;a[c].w=0;a[c].next=head[v];head[v]=c++;
}
bool bfs(){int u,v;queue<int> q;for(int i=s;i<=t;i++)deep[i]=0;deep[s]=1;q.push(s);while(!q.empty()){u=q.front();q.pop();for(int i=head[u];i;i=a[i].next){v=a[i].to;if(a[i].w&&!deep[v]){deep[v]=deep[u]+1;if(v==t)return true;q.push(v);}}}return false;
}
long long dfs(int x,long long limit){if(x==t)return limit;int v;long long sum,cost=0;for(int i=head[x];i;i=a[i].next){v=a[i].to;if(a[i].w&&deep[v]==deep[x]+1){sum=dfs(v,min(a[i].w,limit-cost));if(sum>0){a[i].w-=sum;a[i^1].w+=sum;cost+=sum;if(cost==limit)break;}else deep[v]=-1;}}return cost;
}
long long dinic(){long long ans=0;while(bfs())ans+=dfs(s,MAX);return ans;
}
inline void clean(){c=2;memset(head,0,sizeof(head));memset(a,0,sizeof(a));
}
bool check(long long x){clean();for(int i=1;i<=m;i++)add(s,i,x*attack[i]);for(int i=1;i<=n;i++)add(i+m,t,blood[i]);for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)if(edge[i][j])add(i,j+m,MAX);long long now=dinic();return (now<sum?true:false);
}
void work(){long long l=0,r=100000000000LL,mid;while(l<=r){mid=l+r>>1;if(check(mid))l=mid+1;else r=mid-1;}printf("%.6lf\n",(double)l/10000.00);
}
void init(){n=read();m=read();s=0;t=n+m+1;for(int i=1;i<=n;i++){blood[i]=10000LL*read();sum+=blood[i];}for(int i=1;i<=m;i++)attack[i]=read();for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)edge[i][j]=read();
}
int main(){init();work();return 0;
}
转载于:https://www.cnblogs.com/Yangrui-Blog/p/9519890.html
BZOJ3993: [SDOI2015]星际战争相关推荐
- bzoj3993 [SDOI2015]星际战争
Description \(3333\) 年,在银河系的某星球上, X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了 \(N\) 个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装 ...
- bzoj3993: [SDOI2015]星际战争(二分+最大流)
题目描述 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战. 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值 ...
- bzoj3993 [SDOI2015]星际战争 二分答案+网络流检验
流量分配模型. 这个题如果时间不知道的话流量是未知的,对于流量未知的网络流肯定是没法做的(没有动态借流量的网络流) 由于时间上满足连续性,就可以二分答案,然后流量确定就可以跑网络流 主要还是化静为动 ...
- 【BZOJ3993】[SDOI2015]星际战争 二分+最大流
[BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...
- [SDOI2015]星际战争
题目描述 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战. 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值 ...
- BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)
字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...
- P3324 [SDOI2015]星际战争
传送门:https://www.luogu.org/problemnew/show/P3324 首先瞅一眼数据范围,发现m, n都很小,所以就可以初步断定这是一道网络流的题. 因为题中说每一个武器只能 ...
- 【BZOJ3993】 星际战争
Time Limit: 1000 ms Memory Limit: 128 MB Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一 ...
- 【Luogu-P3324 [SDOI2015] / DSY-1993】星际战争
传送门:P3324 [SDOI2015]星际战争 二分 + 最大流 Solution\mathfrak{Solution}Solution 1 不可否认,看到题面的第一反应是构造二分图,让武器在一边, ...
最新文章
- WIN7安装及配置JDK
- Net分布式系统之:微服务架构
- HDU 5045 Contest
- 【数据库基础知识】数据库表格——主键和外键
- python sendline,python pexpect sendcontrol关键字符
- 【CVTE Web后台开发实习生2019.12.05在线笔试】总结
- 如何从 Windows 虚拟机分离数据磁盘
- 输油管的布置数学建模matlab,输油管的布置-数学建模.docx
- 企业微信有定位跟踪吗?企业微信会跟踪员工轨迹记录吗?
- python十二星座符号_12种编程语言类比12星座女
- 为什么你的前端工作经验不值钱?
- mysql出现表warning_查看mysql的warnings
- python中对字符串进行左、中、右对齐操作
- 高绩效团队的建设与管理
- Muli3D 3 qQuaternionRotationMatrix 函数 (矩阵转四元数)
- HTTP服务(超文本传输协议)
- Rust:Trait 详解
- 四、ESP32单片机wifi的AP与STA模式使用
- ReactiveCocoa之一
- vue页面跳转没有ajax,vue router路由跳转了,但是页面没有变(已解决)