6803 导弹防御塔 0x60「图论」例题

背景

Freda的城堡——

“Freda,城堡外发现了一些入侵者!”

“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”

“可是入侵者已经接近城堡了呀!”

“别担心,rainbow,你看呢,这是我刚设计的导弹防御系统的说~”

“喂...别卖萌啊……”

描述

Freda的城堡遭受了M个入侵者的攻击!Freda控制着N座导弹防御塔,每座塔都有足够数量的导弹,但是每次只能发射一枚。在发射导弹时,导弹需要 T_1 秒才能从防御塔中射出,而在发射导弹后,发射这枚导弹的防御塔需要 T_2 分钟来冷却。

所有导弹都有相同的匀速飞行速度V,并且会沿着距离最短的路径去打击目标。计算防御塔到目标的距离Distance时,你只需要计算水平距离,而忽略导弹飞行的高度。导弹在空中飞行的时间就是 (Distance/V) 分钟,导弹到达目标后可以立即将它击毁。

现在,给出N座导弹防御塔的坐标,M个入侵者的坐标,T_1,T_2 和V。因为Freda的小伙伴Rainbow就要来拜访城堡了,你需要求出至少多少分钟才能击退所有的入侵者。

输入格式

第一行五个正整数N,M,T1,T2,V。

接下来M行每行两个整数,代表入侵者的坐标。

接下来N行每行两个整数,代表防御塔的坐标。

输出格式

输出一个实数,表示最少需要多少分钟才能击中所有的入侵者,四舍五入保留六位小数。

样例输入

3 3 30 20 1
0 0
0 50
50 0
50 50
0 1000
1000 0

样例输出

91.500000

数据范围与约定

  • 对于40%的数据,N,M<=20.

    对于100%的数据, 1≤N≤50, 1≤M≤50,坐标绝对值不超过10000,T1,T2,V不超过2000.
        </article>

题解

答案满足单调性,可以二分答案,转化为判定问题。

显然满足0要素和1要素。将导弹塔拆点,连边跑二分图匹配即可。注意这不是多重匹配,因为同一个导弹塔发射出的导弹不等价。

时间复杂度\(O(m*m*nm\log v)\)

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second co int N=51,M=2501;
co double eps=1e-8;
int n,m,t,t2,V,f[M];
double t1;
bool v[M];
pii a[N],b[N];
pair<int,double> c[M];
vector<int> e[N];
il double dis(co pii&a,co pii&b){
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
bool dfs(int x){
for(unsigned i=0;i<e[x].size();++i){
int y=e[x][i];
if(v[y]) continue;
v[y]=1;
if(!f[y]||dfs(f[y])){
f[y]=x;
return 1;
}
}
return 0;
}
bool judge(double mid){
memset(f,0,sizeof f);
for(int i=1;i<=m;++i){
e[i].clear();
for(int j=1;j<=t;++j)
if(c[j].y+dis(a[i],b[c[j].x])/V<=mid)
e[i].push_back(j);
}
for(int i=1;i<=m;++i){
memset(v,0,sizeof v);
if(!dfs(i)) return 0;
}
return 1;
}
int main(){
read(n),read(m),read(t1),read(t2),read(V);
t=n*m,t1/=60;
for(int i=1;i<=m;++i) read(a[i].x),read(a[i].y);
for(int i=1;i<=n;++i) read(b[i].x),read(b[i].y);
for(int i=1;i<=m;++i)for(int j=1;j<=n;++j){
int k=(i-1)*n+j;
c[k].x=j,c[k].y=(i-1)*(t1+t2)+t1;
}
double l=t1,r=1e5;
while(l+eps<r){
double mid=(l+r)/2;
if(judge(mid)) r=mid;
else l=mid;
}
printf("%.6lf\n",l);
return 0;
}

CH6803 导弹防御塔的更多相关文章

  1. bzoj3035: 导弹防御塔

    Description Freda的城堡——“Freda,城堡外发现了一些入侵者!”“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”“可是入侵者已经接近城堡了呀!”“别担心,rain ...

  2. 「Poetize3」导弹防御塔

    描述 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚导 ...

  3. [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)

    传送门 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚 ...

  4. 【NOIP2013模拟】导弹防御塔

    题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者 ...

  5. Codevs2490 导弹防御塔

    2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master         题目描述 Description Freda的城堡—— ...

  6. contest hunter 6803 导弹防御塔

    没什么好写的.写写这题吧 拆点,把一个防御塔拆成m个,表示第i次攻击.瞎yy就好啊 #include<cstdio> #include<iostream> #include&l ...

  7. 【CH6803】导弹防御塔

    题目大意:给定 N 座塔,M 个怪物,每座塔一次可以发射一枚导弹,发射导弹有发射时间和冷却时间,每座塔和每只怪物有自己的二维坐标,所有导弹有一个共同的速度,求至少需要多长时间才能将所有怪物消灭. 题解 ...

  8. JoyOI1935 导弹防御塔

    原题链接 首先可以二分答案,然后考虑检验答案. 我们可以对炮塔进行拆点,即能发射\(x\)颗导弹就拆成\(n\times x\)个点,作为一个集合,另一个集合则是\(m\)个侵入者,然后对于能在剩余时 ...

  9. joyoi1935 「Poetize3」导弹防御塔

    #include <iostream> #include <cstring> #include <cstdio> #include <queue> #i ...

随机推荐

  1. Oracle Spatial图层元数据坐标范围影响R-TREE索引的ROOT MBR吗?

    Oracle Spatial的空间索引R-TREE,其实现原理为一级级的MBR(最小定界矩形).我突然想到一个问题,它的ROOT MBR是怎么确定的?是根据元数据表user_sdo_geom_meta ...

  2. 阿里云使用Docker部署工单系统(redmine)

    环境:阿里云服务器 Redmine安装部署 Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据 ...

  3. SpringBoot 的拦截器

    首先注册我们要有完整的一个可以开始的开发环境 先自己创建一个配置类 InterceptorConfig, 实现springboot自带的拦截器接口 WebMvcConfigurer. package ...

  4. Qt信号-槽原理剖析--(1)信号槽简介

    唯有创造才是快乐.只有创造的生灵才是生灵.--罗曼·罗兰 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察者, ...

  5. springboot整合mybatis,mongodb,redis

    springboot整合常用的第三方框架,mybatis,mongodb,redis mybatis,采用xml编写sql语句 mongodb,对MongoTemplate进行了封装 redis,对r ...

  6. 【IDEA使用技巧】(2) —— 模板设置

    1.IntelliJ IDEA模板使用 1.1.IDEA Live Templates的使用 选择File—Settings,在Editor中选择Live Templates,即可查看现有对所有语言的 ...

  7. Java8系列 (三) Spliterator可分迭代器

    本文转载自 jdk8 Stream 解析2 - Spliterator分割迭代器. 概述 我们最为常见的流的产生方式是 collection.stream(), 你点开Stream()方法, 他是通过 ...

  8. C# ——Parallel类

    一.Parallel类 Parallel类提供了数据和任务的并行性: 二.Paraller.For() Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务.使用Paral ...

  9. java之hibernate之关联映射之多对一单向关联

    1.在之前学习了单表的crud操作.在实际应用中,大都是多表关联操作,这篇会学习如何处理多表之间的关系. 2.考察书籍表和书籍分类表的关系.书籍表和书籍分类表之间是多对一的关系.数据库的表设计为: 3 ...

  10. C# vb .net实现灰度化特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的灰度化呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步: ...