[bzoj3993][SDOI2015]星际战争-二分+最大流
Brief Description
3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战。在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai。当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机器人就被摧毁了。X军团有M个激光武器,其中第i个激光武器每秒可以削减一个巨型机器人Bi的装甲值。激光武器的攻击是连续的。这种激光武器非常奇怪,一个激光武器只能攻击一些特定的敌人。Y军团看到自己的巨型机器人被X军团一个一个消灭,他们急需下达更多的指令。为了这个目标,Y军团需要知道X军团最少需要用多长时间才能将Y军团的所有巨型机器人摧毁。但是他们不会计算这个问题,因此向你求助。
Algorithm Design
明明是非常水的套路题却卡了很久, 看来是太长时间没有做网络流的题目手生了, 我真的是思博啊, 我这样的人就应该早点滚粗吧Orz
我们考虑直接二分答案, 这样所有武器能输出的最大火力就有了, 按照火力建模, 随便搞搞就有了.
我真是思博啊.
数组开小了...然后不爽一下子开150万就过了Orz
Code
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <queue>
const double eps = 1e-9;
#define ld long double
const int maxn = 110 << 1;
const int inf = 0x3f3f3f;
struct edge {
int to, next;
ld cap;
edge(int a = 0, int b = 0, ld c = 0) : to(a), next(b), cap(c) {}
} e[1500005];
int cnt = 1, n, m, s, t, v;
ld L, R;
int head[maxn], mi[maxn], A[maxn], B[maxn], tod;
ld dist[maxn];
void add_edge(int u, int v, ld c) {
e[++cnt] = edge(v, head[u], c);
head[u] = cnt;
}
void add(int u, int v, ld c) {
add_edge(u, v, c);
add_edge(v, u, 0);
}
void bfs(int s) {
std::fill(dist, dist + v, -1);
dist[s] = 0;
std::queue<int> q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; i; i = e[i].next) {
if (dist[e[i].to] == -1 && e[i].cap > eps) {
dist[e[i].to] = dist[u] + e[i].cap;
q.push(e[i].to);
}
}
}
}
ld dfs(int s, int t, ld flow) {
if (s == t)
return flow;
for (int i = head[s]; i; i = e[i].next) {
// printf("%.2f ", e[i].cap);
if (e[i].cap > eps && dist[e[i].to] > dist[s]) {
ld d = dfs(e[i].to, t, std::min(e[i].cap, flow));
if (d > eps) {
e[i].cap -= d;
e[i ^ 1].cap += d;
return d;
}
}
}
return 0;
}
ld dinic(int s, int t) {
ld flow = 0;
while (1) {
bfs(s);
if (dist[t] == -1)
return flow;
ld d;
while ((d = dfs(s, t, inf)))
flow += d;
}
return flow;
}
bool check(ld mid) {
for (int i = 2; i <= cnt; i += 2)
e[i].cap += e[i ^ 1].cap, e[i ^ 1].cap = 0;
for (int i = head[s]; i; i = e[i].next)
e[i].cap = mid * B[e[i].to];
ld flow = dinic(s, t);
return std::fabs(flow - (ld)tod) <= eps;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input", "r", stdin);
#endif
scanf("%d %d", &n, &m);
s = 0, t = n + m + 1, v = t + 1, L = 0, R = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &A[i]);
mi[i] = inf;
}
for (int i = 1; i <= m; i++)
scanf("%d", &B[i]);
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int x;
scanf("%d", &x);
if (x == 1) {
add(i, j + m, inf);
mi[j] = std::min(mi[j], B[i]);
}
}
add(0, i, inf);
}
for (int i = 1; i <= n; i++) {
R += A[i] / mi[i];
add(i + m, t, A[i]);
tod += A[i];
}
// printf("%d\n", tod);
R = 5e6;
while (R - L > eps) {
ld mid = (L + R) / 2;
if (check(mid))
R = mid;
else
L = mid;
}
printf("%.7Lf", (L + R) / 2);
}
[bzoj3993][SDOI2015]星际战争-二分+最大流的更多相关文章
- 【BZOJ3993】[SDOI2015]星际战争 二分+最大流
[BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...
- bzoj千题计划131:bzoj3993: [SDOI2015]星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...
- bzoj3993: [SDOI2015]星际战争(网络流)
3993: [SDOI2015]星际战争 题目:传送门 题解: 洛谷AC了,但是因为bzoj的spj有问题所以暂时没A 一道老题目了,二分时间然后网络流判断. 每次st-->武器连时间*攻击力 ...
- 【二分答案】【最大流】bzoj3993 [Sdoi2015]星际战争
二分Time,S->炮[i]:Time*b[i] 炮[i]->机器人[i]:INF 机器人[i]->T:a[i]. 判断是否满流. #include<cstdio> #i ...
- [SDOI2015][bzoj3993] 星际战争 [二分+最大流]
题面 传送门 思路 首先,有一个非常明显的模型: 将激光武器放到一边,机器人放到另一边,从每一个激光武器向它可以攻击的机器人连边,形成一个二分图 建立附加源点$ss$和附加汇点$tt$,$ss$连所有 ...
- bzoj3993: [SDOI2015]星际战争(二分+最大流)
题目描述 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战. 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值 ...
- BZOJ3993 [SDOI2015]星际战争 【二分 + 网络流】
题目 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值减少到 ...
- BZOJ3993 [SDOI2015]星际战争
二分答案...然后最大流验证是否可行... 没了,好水啊QAQ /************************************************************** Prob ...
随机推荐
- 【Docker 命令】- pull命令
docker pull : 从镜像仓库中拉取或者更新指定镜像 语法 docker pull [OPTIONS] NAME[:TAG|@DIGEST] OPTIONS说明: -a :拉取所有 tagge ...
- Windows资源监控工具大全
在利用LoadRunner进行性能测试的时候,Windows服务器的资源是经常需要监控的对象.其实除了LoadRunner提供的计数器,似乎Window服务器并不像Unix或者Linux提供众多的性能 ...
- cacti添加多个tomcat监控(多端口)
1.修改tomcat的模版 Data Input Methods->Tomcat Status 把原本固定的端口,用户名和密码手动修改成变量(绿线标出的),之后save保存之后,再在Input ...
- VS05错误:部署WEB文件失败
直接生成一个空项目就不存在这个问题了.
- WPF文件和文件夹的操作
1.对文件的操作 private void button_chose_Click(object sender, RoutedEventArgs e) { var openFileDialog = ne ...
- 第一篇:python基础_1
本篇内容 Python介绍 安装 第一个程序(hello,world) 变量 用户输入(input) 数据类型 数据运算 if判断 break和continue的区别 while 循环 一. Pyth ...
- 【题解】51nod1327 棋盘游戏
那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...
- [JLOI2014]松鼠的新家 树上差分
差分 一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不 ...
- POJ3977:Subset——题解(三分+折半搜索)
http://poj.org/problem?id=3977 题目大意:有一堆数,取出一些数,记他们和的绝对值为w,取的个数为n,求在w最小的情况下,n最小,并输出w,n. ————————————— ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...