http://www.lydsy.com/JudgeOnline/problem.php?id=3993

调了好长时间啊

这道题设时间为time,那么对于m个武器从S向这m个点连容量为time*Bi的边,代表能造成的总伤害。

对于每个武器向每个能打到的机器人连容量为无穷的边。

对每个机器人向T连自己的装甲量Ai为容量的边。

又因为每个机器人的装甲必须被打完,所以设机器人到T的边的下界为Ai(上下界相等)。

从T向S连容量无穷大的边,构成无源汇上下界网络流,所以构造附加网络然后二分时间time就可以了。

注意附加网络有一些边是走不通的,所以把那些边删掉也可以

(删掉后和原网络没什么区别啊Σ( ° △ °|||)︴那我还讲这么偏QAQ)。

Dinic模板打残致命伤!!!以后改数组边界的时候注意要看程序中调用数组边界的常量是否也需要改。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define forU(i, a, b) for (int i = (a), UP = (b); i <= UP; ++i)
#define forD(i, a, b) for (int i = (a), DOWN = (b); i >= DOWN; --i)
using namespace std; inline double fabs(double x) {return x < 0 ? -x : x;} const int N = 55;
const int M = N * N * 2; struct node {
int nxt, to; double c;
node(int _nxt = 0, int _to = 0, double _c = 0) : nxt(_nxt), to(_to), c(_c) {}
} E[M];
int cnt, point[N << 1], cur[N << 1]; void ins(int u, int v, double c) {
E[++cnt] = node(point[u], v, c); point[u] = cnt;
E[++cnt] = node(point[v], u, 0); point[v] = cnt;
} bool can[N][N];
int q[N << 1], n, m, S, T, d[N << 1];
double A[N], B[N]; bool BFS() {
memset(d, 0, sizeof(int) * (T + 1));
int head = 0, tail = 1, u, v; q[1] = S; d[S] = 1;
while (head != tail) {
u = q[++head];
for (int i = point[u]; i; i = E[i].nxt)
if (fabs(E[i].c) > 1e-12 && !d[v = E[i].to]) {
d[v] = d[u] + 1;
q[++tail] = v;
}
}
return d[T];
} double DFS(int u, double a) {
if (fabs(a) < 1e-12 || u == T) return a;
double f, flow = 0;
for (int &i = cur[u]; i; i = E[i].nxt)
if (d[E[i].to] == d[u] + 1 && fabs(f = DFS(E[i].to, min(a, E[i].c))) > 1e-12) {
a -= f; flow += f; E[i].c -= f; E[i ^ 1].c += f;
if (fabs(a) < 1e-12) break;
}
return flow;
} double Dinic() {
double flow = 0;
while (BFS()) {
memcpy(cur, point, sizeof(int) * (T + 1));
flow += DFS(S, 100000000000000.0);
}
return flow;
} double tot = 0; bool can2(double tim) {
memset(point, 0, sizeof(int) * (T + 1));
cnt = 1;
forU (i, 1, m) {
ins(S, i, tim * B[i]);
forU (j, 1, n)
if (can[i][j])
ins(i, j + m, 100000000000000.0);
}
forU (i, 1, n) ins(i + m, T, A[i]); return fabs(Dinic() - tot) < 1e-5;
} int main() {
scanf("%d%d", &n, &m); S = n + m + 1; T = S + 1;
forU (i, 1, n) scanf("%lf", A + i), tot += A[i];
forU (i, 1, m) scanf("%lf", B + i);
int num;
double left = 0, right = 0, mid;
forU (i, 1, m)
forU (j, 1, n) {
scanf("%d", &num);
can[i][j] = num;
}
forU (i, 1, n) {
double fornow = 0;
forU (j, 1, m)
fornow = max(fornow, B[j]);
right += ceil(A[i] / fornow);
} while (right - left > 1e-5) {
mid = (left + right) / 2.0;
if (can2(mid)) right = mid;
else left = mid;
} printf("%lf\n", left);
return 0;
}

【BZOJ 3993】【SDOI 2015】星际战争的更多相关文章

  1. BZOJ 3993 [SDOI 2015] 星际战争 解题报告

    首先我们可以二分答案. 假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验: 设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$: 设机器人为 $Y$,第 $i$ 个机器人的装甲 ...

  2. [SDOI 2015] 星际战争

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3993 [算法] 首先发现问题具有单调性 , 不妨二分答案mid 考虑网络流 : 将源 ...

  3. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  4. BZOJ 3990 [SDOI 2015] 排序 解题报告

    这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...

  5. BZOJ 3992 [SDOI 2015] 序列统计 解题报告

    这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...

  6. [BZOJ 3992] [SDOI 2015] 序列统计

    Description 传送门 Solution [一] 设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(j\) 的方案数,有 \[ f[i][j]=\su ...

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

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

  8. BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案

    链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...

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

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

  10. 3993: [SDOI2015]星际战争

    3993: [SDOI2015]星际战争 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1244  Solved: ...

随机推荐

  1. 浅谈Collection集合

    俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ...

  2. Eclipse "Unable to install breakpoint due to missing line number attributes..."

    Eclipse 无法找到 该 断点,原因是编译时,字节码改变了,导致eclipse无法读取对应的行了 1.ANT编译的class Eclipse不认,因为eclipse也会编译class.怎么让它们统 ...

  3. Java - I/O

    File类 java.io 操作文件和目录,与平台无关.具体的常用实例方法: File file = new File("."); // 以当前路径创建名为 ".&quo ...

  4. SpringAOP与Redis搭建缓存

    近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做查询部分: 数据查询时每次都需要从数据库 ...

  5. Spring 4 + Quartz 2.2.1 Scheduler Integration Example

    In this post we will see how to schedule Jobs using Quartz Scheduler with Spring. Spring provides co ...

  6. SSH框架整合

    SSH框架整合 一.原理图 action:(struts2) 1.获取表单的数据 2.表单的验证,例如非空验证,email验证等 3.调用service,并把数据传递给service Service: ...

  7. 菜鸟快飞之JavaScript对象、原型、继承(三)

    正文之前需要声明的一点是,菜鸟系列博文全是基于ES5的,不考虑ES6甚至更高版本. 继承 由于我个人不是学计算机的,所以对于很多东西只是知其然,不知其所以然.就像这个继承,刚开始学JavaScript ...

  8. sharepoint 计算列 年龄

    1.建立一个字段叫做Today ,(类型为文本都行) 2.建立你想要计算字段年龄,公式=IF(ISBLANK(出生年月),"NA",DATEDIF(出生年月,Today," ...

  9. iOS 自定义方法 - UIView扩展

    示例代码 //#import <UIKit/UIKit.h>@interface UIView (LPCView)/** 上 */@property CGFloat top;/** 下 * ...

  10. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...