BZOJ 3993 [SDOI 2015] 星际战争 解题报告
首先我们可以二分答案。
假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验:
设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$;
设机器人为 $Y$,第 $i$ 个机器人的装甲为 $A_i$;
设 $Map[i][j]$ 表示第 $i$ 个机器人是否能攻击第 $j$ 号机器人。
设源为 $S$,汇为 $T$,现在考虑连边:
- $S\rightarrow X_i$,容量为 $Ans * B_i$;
- $Y_i\rightarrow T$,容量为 $A_i$;
- $\forall (i,j),Map[i][j]=1:X_i\rightarrow Y_j$,容量为 $\infty$
然后跑网络流,假设最大流为 $M$,那么看是否有:$M=\sum A_i$。
如果是,那么说明当前答案是满足的,更新上界,否则更新下界。
毕竟 Gromah 太弱,只会做水题。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long double LD;
#define N 50 + 5
#define M 100000 + 5
#define INF 1e9
#define eps 1e-9 int n, m, S, T, sum, tot;
int A[N], B[N];
int Head[N << ], q[N << ], Dfn[N << ];
bool Map[N][N];
LD l = 0.0, r; struct Edge
{
int next, node;
LD flow;
}h[M]; inline void addedge(int u, int v, LD fl)
{
h[++ tot].next = Head[u], Head[u] = tot;
h[tot].node = v, h[tot].flow = fl;
h[++ tot].next = Head[v], Head[v] = tot;
h[tot].node = u, h[tot].flow = ;
} inline bool BFS()
{
for (int i = S; i <= T; i ++)
Dfn[i] = ;
int l = , r = ;
q[] = S, Dfn[S] = ;
while (l <= r)
{
int z = q[l ++];
for (int i = Head[z]; i; i = h[i].next)
{
int d = h[i].node;
LD p = h[i].flow;
if (p < eps || Dfn[d]) continue ;
Dfn[d] = Dfn[z] + ;
q[++ r] = d;
if (d == T) return ;
}
}
return ;
} inline LD dinic(int z, LD inflow)
{
if (z == T || inflow < eps) return inflow;
LD ret = inflow, flow;
for (int i = Head[z]; i; i = h[i].next)
{
int d = h[i].node;
LD p = h[i].flow;
if (Dfn[d] != Dfn[z] + ) continue ;
flow = dinic(d, min(p, ret));
ret -= flow;
h[i].flow -= flow, h[i ^ ].flow += flow;
if (ret < eps) return inflow;
}
if (fabs(inflow - ret) < eps) Dfn[z] = -;
return inflow - ret;
} inline bool Judge(LD k)
{
tot = ;
for (int i = S; i <= T; i ++)
Head[i] = ;
for (int i = ; i <= m; i ++)
addedge(S, i, k * B[i]);
for (int i = ; i <= n; i ++)
addedge(i + m, T, A[i]);
for (int i = ; i <= m; i ++)
for (int j = ; j <= n; j ++)
if (Map[i][j]) addedge(i, j + m, INF);
LD res = 0.0;
while (BFS())
res += dinic(S, INF);
return fabs(res - sum) < eps;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3993.in", "r", stdin);
freopen("3993.out", "w", stdout);
#endif scanf("%d%d", &n, &m);
S = , T = n + m + ;
for (int i = ; i <= n; i ++)
{
scanf("%d", A + i);
r += A[i];
sum += A[i];
}
for (int i = ; i <= m; i ++)
scanf("%d", B + i);
for (int i = ; i <= m; i ++)
for (int j = ; j <= n; j ++)
scanf("%d", Map[i] + j);
while (l + 1e- < r)
{
LD mid = (l + r) / ;
if (Judge(mid)) r = mid;
else l = mid;
}
printf("%.4lf\n", (double) l); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}
3993_Gromah
BZOJ 3993 [SDOI 2015] 星际战争 解题报告的更多相关文章
- BZOJ 3992 [SDOI 2015] 序列统计 解题报告
这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...
- [SDOI 2015] 星际战争
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3993 [算法] 首先发现问题具有单调性 , 不妨二分答案mid 考虑网络流 : 将源 ...
- BZOJ 4004 [JLOI 2015] 装备购买 解题报告
哎这个题 WA 了无数遍...果然人太弱... 首先我们把这些装备按照花费从小到大排序,然后依次考虑是否能买这个装备. 至于这样为什么是对的,好像有一个叫拟阵的东西可以证明,然而我不会.TATQAQ ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- BZOJ 3990 [SDOI 2015] 排序 解题报告
这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...
- NOI 2015 滞后赛解题报告
报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P2245 星际导航 解题报告
P2245 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向 ...
- 洛谷 P2469 [SDOI2010]星际竞速 解题报告
题目描述 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一. 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其 ...
随机推荐
- windows下搭建属于自己的web服务器
这次需要记录一下我搭建web服务器的过程. 第一步,确定自己要使用的平台:这次我用的是windows2008 server版本 第二步,计划是想要纯手工的安装apache.php等.但是我们可以下载一 ...
- VIM 选择多行,复制粘贴
进入VIM,比如编辑一个文件, 1.进行选择,是V模式,按V键,进入该模式,然后选择要复制的行 2. 选择好之后,再按y键,即使复制到了 3.然后光标进入要复制的行之后,按一下P键,就粘贴了,oh y ...
- HTML5吧!少年
一.为了能使IE9以下的IE浏览器也能支持html5的标签,所以首先得在文档头部用条件注释的方法引入那段著名的代码. 1 2 3 <!--[if lt IE 9]> <script ...
- asp下实现多条件模糊查询SQL语句
常写一个简单的模糊查询的SQL语句格式可以如下例: sql="select * from 表名 where 字段名 like ’%" & request.form(&quo ...
- 学习笔记1_Day09_Servlet
生命周期方法: l void init(ServletConfig):出生之后(1次): l void service(ServletRequest request, ServletRespons ...
- C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)
一.C# vs SQLite: C# SQLite 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool BIT NOT NULL Boolean F_BOOL_N ...
- javascript form 第22节
<html> <head> <title>Form对象</title> </style> <script type="tex ...
- top每个参数的意义
上图来源于本人虚拟机,作为每个参数解释的参考 10:32:20:现在的时间 up 1 min : 服务器运行的时长 1 user:现在只有1个用户登录 load average: 0.74, 0.25 ...
- jquery控制左右箭头滚动图片列表
jquery控制左右箭头滚动图片列表的实例. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- /dev/null 2>&1 解释(转)
cmd >a 2>a 和 cmd >a 2>&1 为什么不同? cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍, ...