Bzoj1822 [JSOI2010]Frozen Nova 冷冻波
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1933 Solved: 608
Description
当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵。
在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。
现在巫妖的头目想知道,若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?
Input
接下来N行,每行包含四个整数x, y, r, t,分别代表了每个巫妖的坐标、攻击范围和施法间隔(单位为秒)。
再接下来M行,每行两个整数x, y,分别代表了每个小精灵的坐标。
再接下来K行,每行三个整数x, y, r,分别代表了每个树木的坐标。
输入数据中所有坐标范围绝对值不超过10000,半径和施法间隔不超过20000。
Output
Sample Input
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 10
Sample Output
HINT
Source
图论 网络流 计算几何
没什么意义的板子题
$O(n^3)$用计算几何判断每个巫妖能攻击到哪些小精灵。只需要判断巫妖到小精灵的连线是否与代表树的圆相离即可。
二分答案,用最大流check限定时间内能否将小精灵消灭完:
源点向每个小精灵连边,容量为1;
每个小精灵向能攻击到它的巫妖连边,容量为1
每个巫妖向汇点连边,容量为限定时间内的最多攻击次数。
(注意技能没有开场CD,时间为0时即可攻击)
(看上去像是简单的网络流+简单的计算几何凑了一道码农题)
——Frozen Nova霜冻新星 怎么翻译成冷冻波这种奇怪的名字啊? (亡灵族玩家激怒)
——为什么要屠杀小精灵啊? (NE玩家激怒)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int mxN=;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-f;ch=getchar();}
while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
return x*f;
}
struct edge{
int u,v,nxt,f;
}e[mxN];
int hd[mxn*mxn],mct=;
int n,m,S,T,d[mxN];
void add_edge(int u,int v,int f){
e[++mct].v=v;e[mct].u=u;e[mct].nxt=hd[u];e[mct].f=f;hd[u]=mct;return;
}
void insert(int u,int v,int f){
add_edge(u,v,f);add_edge(v,u,);return;
}
//
queue<int>q;
bool BFS(){
for(int i=;i<=T;i++)d[i]=;
d[S]=; q.push(S);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(e[i].f && !d[v]){
d[v]=d[u]+;
q.push(v);
}
}
}
return d[T];
}
int DFS(int u,int lim){
if(u==T)return lim;
int f=,tmp;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(e[i].f && d[v]==d[u]+ && (tmp=DFS(v,min(lim,e[i].f)))){
e[i].f-=tmp;
e[i^].f+=tmp;
lim-=tmp;
f+=tmp;
if(!lim)return f;
}
}
d[u]=;
return f;
}
int Dinic(){
int res=;
while(BFS())res+=DFS(S,INF);
return res;
}
//
struct point{
double x,y;
point(){}
point(double _x,double _y):x(_x),y(_y){}
point operator - (const point &b){return point(x-b.x,y-b.y);}
}lich[mxn],tr[mxn],wisp[mxn];
int range[mxn],CD[mxn],R[mxn];
double Cross(const point &a,const point &b){return a.x*b.y-a.y*b.x;}
double DT(double x){
if(fabs(x)<1e-)return ;
return (x>)?:-;
}
double Dist(const point &a,const point &b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int K;
//
bool check(int a,int b){
double tmp=Dist(lich[a],wisp[b]);
if(tmp+1e->(double)range[a])return ;
for(int i=;i<=K;i++){
double res=Cross(wisp[b]-lich[a],tr[i]-lich[a]);
if(DT(res)==){
if(Dist(lich[a],wisp[b])+R[i]<max(Dist(lich[a],tr[i]),Dist(wisp[b],tr[i])))return ;
continue;
}
else{
double h=fabs(res)/tmp;
if(h+1e-<R[i])return ;
}
}
return ;
}
//
vector<int>ve[mxn];
bool vis[mxn];
void Build(int lim){
memset(hd,,sizeof hd);mct=;
int i,j;
for(i=;i<=m;i++)insert(S,i,);
for(i=;i<=n;i++)insert(m+i,T,lim/CD[i]+);
for(i=;i<=n;i++)
for(j=;j<ve[i].size();j++)
insert(ve[i][j],m+i,);
return;
}
void solve(){
S=;T=n+m+;
int l=,r=1e7,ans=INF;
while(l<=r){
int mid=(l+r)>>;
Build(mid);
int tmp=Dinic();
if(tmp==m){
ans=mid;r=mid-;
}else l=mid+;
}
printf("%d\n",ans);
return;
}
// int main(){
// freopen("in.txt","r",stdin);
int i,j;
n=read();m=read();K=read();
for(i=;i<=n;i++){
lich[i].x=read();lich[i].y=read();
range[i]=read();CD[i]=read();
}
for(i=;i<=m;i++){
wisp[i].x=read();wisp[i].y=read();
}
for(i=;i<=K;i++){tr[i].x=read();tr[i].y=read();R[i]=read();}
for(i=;i<=n;i++)
for(j=;j<=m;j++)
if(check(i,j)){
ve[i].push_back(j);
vis[j]=;
}
for(i=;i<=m;i++){
if(!vis[i]){
printf("-1\n");
return ;
}
}
solve();
return ;
}
Bzoj1822 [JSOI2010]Frozen Nova 冷冻波的更多相关文章
- 【计算几何】【二分答案】【最大流】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 题解 好久没做网络流的,都没有想到网络流... 首先暴力判断一下一个巫妖和一个精灵之间能 ...
- 【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 冷冻波 计算几何+二分+网络流最大流
题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
- BZOJ 1822[JSOI2010]Frozen Nova 冷冻波
网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止 ...
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
- BZOJ1822 Frozen Nova 冷冻波
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...
随机推荐
- lintcode-14-二分查找
二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 ...
- iOS开发改变字符串中指定字符颜色,大小等等
NSString *strJTGZ = [NSString stringWithFormat:@"交通管制%d处 ",[jtgz intValue]]; NSMutableAttr ...
- iOS-加载html字符串
NSMutableAttributedString * attrString =[[NSMutableAttributedString alloc] initWithData:[resultModel ...
- BZOJ 1057 棋盘制作(最大01相间子矩阵)
求最大01相间子矩阵可以转换为求最大全0子矩阵.只需把棋盘(x+y)为奇数的取反,而该问题可以用经典的悬线法O(n^2)的求解. 悬线法呢. 首先定义b[i][j],为a[i][j]向上的最大连续0的 ...
- 配置bond和vlan
网卡是光口还是电口的方法ethtool 网卡名字 一看速度二看port是否是firber首先查看需要做bond的物理网卡,如enp130s0f0,enp131s0f0以物理网卡为enp130s0f0, ...
- CF#67 75d Big Maximum Sum
~~~题面~~~ 题解: 观察到拼接后的数据范围过大,无法O(n)解决,但是大区间是由很多小区间组成,而小区间是固定的,不会变化,所以可以考虑预处理出每个小区间的信息,然后根据给定序列按顺序一步一步合 ...
- Hadoop Yarn-入门篇
参考并推荐博文:https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ 重构根本的思想是将 JobTracker 两个主 ...
- bzoj2733: [HNOI2012]永无乡(splay+启发式合并/线段树合并)
这题之前写过线段树合并,今天复习Splay的时候想起这题,打算写一次Splay+启发式合并. 好爽!!! 写了长长的代码(其实也不长),只凭着下午的一点记忆(没背板子...),调了好久好久,过了样例, ...
- 基础dp例题整理
背包: 消失之物 先直接做一遍,必然对于i,有 for(j=m;j>=w[i];--j) f[i]+=f[i-w[i]] 所以,如果排除用i做背包的结果,减去这个转移就好了. memcpy(g, ...
- 51nod 1172 Partial Sums V2 卡精度的任意模数FFT
卡精度的任意模数fft模板题……这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.然后我就去网上抄了一下板子……我打的是最土的任意模数f ...