BZOJ1822 Frozen Nova 冷冻波
1822: [JSOI2010]Frozen Nova 冷冻波
Time Limit: 10 Sec Memory Limit: 64 MB
Description
Input
Output
Sample Input
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 10
Sample Output
Source
题解
网络流 + 二分答案 + 计算几何
计算几何用点积和叉积计算点到线段距离,二分所需时间,网络流验证是否可行
大水题,数据有点坑qwq
代码
#include<bits/stdc++.h>
using namespace std;
template <class _T> inline void read(_T &_x) {
int _t; bool flag = false;
while ((_t = getchar()) != '-' && (_t < '' || _t > '')) ;
if (_t == '-') _t = getchar(), flag = true; _x = _t - '';
while ((_t = getchar()) >= '' && _t <= '') _x = _x * + _t - '';
if (flag) _x = -_x;
}
typedef long long LL;
const int maxn = ;
const int maxm = ;
const double eps = 1e-;
inline int sign(double val) {return val < -eps ? - : val > eps; }
struct Point {
double x, y;
Point (double a = , double b = ):x(a), y(b) {}
}A[maxn], B[maxn], C[maxn];
double rA[maxn], rC[maxn];
double dot(Point a, Point b, Point c) {
return (b.x - a.x) * (c.x - a.x) + (b.y - a.y) * (c.y - a.y);
}
double cross(Point a, Point b, Point c) {
return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
}
double dist(Point a, Point b) {
return hypot(a.x - b.x, a.y - b.y);
}
double ldis(Point a, Point b, Point c) {
if (dot(c, a, b) > ) return min(dist(a, c), dist(b, c));
return fabs(cross(a, b, c) / dist(a, b));
}
bool check(Point a, Point b, Point c, int pc) {
double dis = dist(a, b), r = dot(a, b, c) / dis;
if (r < || r > dis) return true;
return sign(fabs(cross(a, b, c) / r) - rC[pc]) > ;
}
struct Edge {
int v, flow, nxt;
Edge () {}
Edge (int a, int b, int c):v(a), flow(b), nxt(c) {}
}e[maxm];
int n, m, k, t[maxn], sink;
int fir[maxn], tag[maxn], cur[maxn], ecnt;
bool can[maxn][maxn];
inline void addedge (int a, int b, int c) {
e[++ecnt] = Edge (b, c, fir[a]), fir[a] = ecnt;
e[++ecnt] = Edge (a, , fir[b]), fir[b] = ecnt;
}
inline bool bfs() {
memset(tag, , sizeof (int) * (sink + ));
queue<int> q; q.push(), tag[] = ;
while (!q.empty()) {
int now = q.front(); q.pop();
for (int u = fir[now]; u; u = e[u].nxt) {
if (e[u].flow && !tag[e[u].v]) {
tag[e[u].v] = tag[now] + ;
q.push(e[u].v);
}
}
}
return tag[sink] != ;
}
int dfs(int now, int flow) {
if (now == sink) return flow;
int usd = ;
for (int &u = cur[now]; u; u = e[u].nxt) {
if (e[u].flow && tag[e[u].v] > tag[now]) {
int ret = dfs(e[u].v, min(e[u].flow, flow - usd));
if (ret) {
e[u].flow -= ret;
e[u ^ ].flow += ret;
usd += ret;
if (usd == flow) return flow;
}
}
}
return usd;
}
inline int dinic() {
int flow = ;
while (bfs()) {
for (int i = ; i <= sink; ++i) cur[i] = fir[i];
flow += dfs(, m);
}
return flow;
}
bool check(int tim) {
memset(fir, , sizeof (int) * (sink + ));
ecnt = ;
for (int i = ; i <= n; ++i) {
addedge(, i, tim / t[i] + );
for (int j = ; j <= m; ++j) if (can[i][j]) {
addedge(i, n + j, );
}
}
for (int i = ; i <= m; ++i) addedge(n + i, sink, );
return dinic() >= m;
}
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
read(n), read(m), read(k);
for (int i = ; i <= n; ++i) {
scanf("%lf%lf%lf%d", &A[i].x, &A[i].y, &rA[i], &t[i]);
}
for (int i = ; i <= m; ++i) {
scanf("%lf%lf", &B[i].x, &B[i].y);
}
for (int i = ; i <= k; ++i) {
scanf("%lf%lf%lf", &C[i].x, &C[i].y, &rC[i]);
}
for (int i = ; i <= n; ++i) {
for (int j = ; j <= m; ++j) {
bool flag = true;
double dis = dist(A[i], B[j]);
if (dis > rA[i]) continue;
for (int x = ; x <= k; ++x) {
if (ldis(A[i], B[j], C[x]) < rC[x]) {
flag = false;
break;
}
}
if (flag) can[i][j] = true;
}
}
for (int i = ; i <= m; ++i) {
bool flag = false;
for (int j = ; j <= n; ++j) if (can[j][i]) {
flag = true; break;
}
if (!flag) {
puts("-1");
return ;
}
}
sink = n + m + ;
int l = , r = * m, mid;
while (l < r) {
if (check(mid = (l + r) >> )) r = mid;
else l = mid + ;
}
cout << l << endl;
return ;
}
BZOJ1822 Frozen Nova 冷冻波的更多相关文章
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
- 【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流
[BZOJ1822][JSOI2010]Frozen Nova 冷冻波 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀 ...
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 585 Solved: 175[Subm ...
- Bzoj1822 [JSOI2010]Frozen Nova 冷冻波
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1933 Solved: 608 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖 ...
- 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
- BZOJ 1822 Frozen Nova 冷冻波(最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1822 题意:WJJ喜欢“魔兽争霸”这个游戏.在 游戏中,巫妖是一种强大的英雄,它的技能F ...
- 【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波
用三角形面积什么的算算点到直线的距离之类……其实相切的情况是可行的……剩下的就跟某SDOI2015一样了. #include<cstdio> #include<cmath> # ...
- bzoj1822: [JSOI2010]Frozen Nova 冷冻波网络流
思路比较显然:二分答案,流流流 但是实现的时候感觉自己数学捉急.. 一开始算了个直线到点距离.... 应该是线段到点距离 #include <bits/stdc++.h> #define ...
- BZOJ1822 [JSOI2010]Frozen Nova 冷冻波 二分+最大流
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1822 题解 好久没做网络流的,都没有想到网络流... 首先暴力判断一下一个巫妖和一个精灵之间能 ...
随机推荐
- 使用 oracle pipelined 返回一个结果集;
1.使用 create or replace package refcursor_pkg is -- Author : mr.yang -- Created : 5/14/2017 5:13:42 P ...
- Linux内核0.11 bootsect文件说明
一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下bootsect.s源文件的说明,其中涉及到了一些基础知识可以参考这两篇文章. 操作系统启动过程 软盘相关知识和通过BIO ...
- SpannableString的基本用法
原文地址:http://www.cnblogs.com/kross/p/3645594.html 以前一直好奇QQ的输入框里面是如何出现表情的,今天看了下这个,心中发出“原来是这样啊”的感叹. 通常情 ...
- php 关于文件夹的一些封装好的函数
/** *检测文件名是否合法 * @param string $filename * @return boolean */ function checkFilename($filename){ $pa ...
- 【刷题】洛谷 P1402 酒店之王
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
- 洛谷P1592 互质
题目描述 输入两个正整数n和k,求与n互质的第k个正整数. 输入输出格式 输入格式: 仅一行,为两个正整数n(≤10^6)和k(≤10^8). 输出格式: 一个正整数,表示与n互质的第k个正整数. 由 ...
- IDEA的强大
由于朋友推荐,转战IDEA数日,发现一个字就是,牛,完爆任何开发工具,让你代码上瘾的工具. 它集合了所有的开发所需要的东西,且智能化方便,适合开发有一定经验的人去使用,你会爱上它. 下面是快捷键的使用 ...
- 修改const保护的值
先看代码: #include <stdio.h> void main() { const int num = 10; int *a = (int *)(void *)# / ...
- 什么是Docker并且它为什么这么受欢迎
什么是Docker (why it's so hot than hot) Docker是一个使用容器来方便快捷的创建,部署,运行程序的工具,容器允许开发人员将应用程序的一切打包(镜像),例如库和其他的 ...
- Linux运维七:网络基础
1:网线 2:交换机,路由器 交换机(Switch)意为“开关”是一种用于电(光)信号转发的网络设备.它可以为接入交换机的任意两个网络节点提供独享的电信号通路.最常见的交换机是以太网交换机.其他常见的 ...