题意:

WJJ喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是平面上的点。 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵。 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。 现在巫妖的头目想知道,若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?

题解:

几何+二分+网络流。
这题很容易想到二分+网络流求答案。
但是难在怎么判断巫妖能不能打到011
注意,树木很粗壮。
首先有三种情况。

好吧也可以说是两种。
点到直线距离公式:

d=|x0+By0+CA2+B2−−−−−−−√|

d=\vert \frac{x_0+By_0+C}{\sqrt{A^2+B^2}} \vert
详细见百度。
对于第一种情况,直接带公式就行了。
但第二种情况就应该取到端点的最短值。
所以我们还要求出点到两端点的较大值。
勾股求第三边。

假如这条边的长度小于线段长,那么在是第一种情况,否则为第二种情况。
然后就愉快的建图+跑流了。
code:

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct node{int x,y,next,c,other;
}a[2500000];int last[500],len=0;
int h[500],s[500],st,ed;
void ins(int x,int y,int c)
{int k1=++len;a[len].x=x;a[len].y=y;a[len].c=c;a[len].next=last[x];last[x]=len;int k2=++len;a[len].x=y;a[len].y=x;a[len].c=0;a[len].next=last[y];last[y]=len;a[k1].other=k2;a[k2].other=k1;
}
bool bt_h()
{memset(h,0,sizeof(h));int l=1,r=2;s[l]=st;h[st]=1;while(l!=r){int x=s[l];for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(h[y]==0&&a[i].c>0) h[y]=h[x]+1,s[r++]=y;}l++;}return h[ed]!=0;
}
int findflow(int x,int f)
{if(x==ed) return f;int t,ans=0;for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(h[x]+1==h[y]&&a[i].c>0&&ans<f){ans+=(t=findflow(y,min(a[i].c,f-ans)));a[i].c-=t;a[a[i].other].c+=t;}}if(ans==0) h[x]=0;return ans;
}
struct point{int x,y;
}p1[210],p2[210],p3[210];
int R[210];
struct NODE{int r,t;
}wy[210];
int n,m,k;
bool check[210][210],kill[210];
/*int multi(point p1,point p2,point p0)
{int x1=p1.x-p0.x,x2=p2.x-p0.x;int y1=p1.y-p0.y,y2=p2.y-p0.y;return x1*y2-x2*y1;
}*/
double cz(int A,int B,int C,point p){return abs((double)(A*p.x+B*p.y+C)/sqrt((double)A*A+(double)B*B));}
double dis(point p1,point p2){return sqrt((double)(p1.x-p2.x)*(p1.x-p2.x)+(double)(p1.y-p2.y)*(p1.y-p2.y));}
bool shoot(point p1,point p2,int r)
{double LEN=dis(p1,p2);if(LEN>(double)r) return false;int A=p2.y-p1.y,B=p1.x-p2.x;int C=-(A*p1.x+B*p1.y);for(int i=1;i<=n;i++){/*double tmp;if(multi(p1,p2,p3[i])==0)else*/double aa=cz(A,B,C,p3[i]),cc=max(dis(p1,p3[i]),dis(p2,p3[i])),t;if(sqrt(cc*cc-aa*aa)>LEN) t=min(dis(p1,p3[i]),dis(p2,p3[i]));else t=aa;if(t<R[i]) return false;}return true;
}
bool CHECK(int t)
{memset(last,0,sizeof(last));len=0;st=0;ed=n+m+1;for(int i=1;i<=n;i++){ins(st,i,t/wy[i].t+1);for(int j=1;j<=m;j++)if(check[i][j]) ins(i,j+n,1);}for(int i=1;i<=m;i++) ins(i+n,ed,1);int ans=0;while(bt_h()) ans+=findflow(st,999999999);return ans==m;
}
int main()
{scanf("%d %d %d",&n,&m,&k);for(int i=1;i<=n;i++) scanf("%d %d %d %d",&p1[i].x,&p1[i].y,&wy[i].r,&wy[i].t);for(int i=1;i<=m;i++) scanf("%d %d",&p2[i].x,&p2[i].y);for(int i=1;i<=k;i++) scanf("%d %d %d",&p3[i].x,&p3[i].y,&R[i]);memset(check,false,sizeof(check));memset(kill,false,sizeof(kill));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(shoot(p1[i],p2[j],wy[i].r)) check[i][j]=true,kill[j]=true;/*for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) printf("%d ",check[i][j]);printf("\n");}*/for(int i=1;i<=m;i++)if(!kill[i]){printf("-1");return 0;}int l=0,r=5000000,ans=0;while(l<=r){int mid=(l+r)/2;if(CHECK(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d",ans);
}

bzoj 1822: [JSOI2010]Frozen Nova 冰霜新星相关推荐

  1. BZOJ 1822 浅谈计算几何在网络流建模中的实际运用

    世界真的很大 网络流是个神奇东西,可以用来解决很多意想不到的问题 但是做题久了,有套路了,大多数网络流也就不是那么难 只要建好模型,跑模板就OK 然后就会出现某些丧心病狂的出题人想到干脆卡一下建边之类 ...

  2. BZOJ 1822 Frozen Nova 霜冻新星

    分配问题,将小精灵分配给巫妖,巫妖可接收量取决于时间长短,适应性取决于地形 预处理巫妖小精灵对的可行性,就是询问线段 \(AB\) 与圆 \(O\) 是否有交点 过点 \(O\) 作直线 \(AB\) ...

  3. BZOJ 2208[Jsoi2010]连通数

    题面: 2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3100  Solved: 1347 [Submit] ...

  4. BZOJ 1821: [JSOI2010]Group 部落划分 Group【MST】

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MB Description 聪聪研究发现,荒岛野人总是过着群 ...

  5. bzoj 1821: [JSOI2010]Group 部落划分

    1821: [JSOI2010]Group 部落划分 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2484  Solved: 1165 [Submi ...

  6. BZOJ 1821 [JSOI2010] Group 部落划分 Group

    最小生成森林? 个人感觉跟最小生成树差不多.需要分成k个联通块,让联通块之间距离最大就让联通块内距离尽可能小.一颗最小生成树是N-1条边,分成k个块需要切k-1条,就是一个n-k条边的最小生成森林,然 ...

  7. [BZOJ]1826: [JSOI2010]缓存交换 线段树

    Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache.此时,如果Cache容量已满,则必须先从中删除一 ...

  8. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  9. 图论复习(各类习题)

    可以结合这篇博客进行复习:http://www.cnblogs.com/z360/p/7363034.html 一.强连通分量.缩点 习题: 洛谷--P2746 [USACO5.3]校园网Networ ...

最新文章

  1. sqlite3自增key设定(创建自增字段)
  2. 在AE10.1环境下调试其他版本的程序
  3. Hadoop自带WordCount.java程序
  4. 招商银行的AI野心:转型金融科技公司?
  5. 守卫者的挑战(guard)
  6. CF1612G Max Sum Array
  7. 图象关于y轴对称是什么意思_数学概念丨“图象”与“图像”是有区别的 ,你知道吗?...
  8. cario java_Cairo图形库 概述
  9. php 彩票系统,hsyl12141511 一套完整的PHP版彩票系统 - 下载 - 搜珍网
  10. pygame的最小系统
  11. php 获取上周日期_php 获取上一周下一周的日期列表
  12. AndroidStudio_android开发在线文档_在线API_蓝牙开发在线文档---Android原生开发工作笔记243
  13. 计算机网络(入门知识点最全整理)
  14. Unity制作的照片墙效果
  15. [10]STM32程序调试方法-STLINK调试和软件调试
  16. 《Software Testing》英文原著阅读 单词
  17. 点播系统加服务器加投影加音响,打造真实家庭影院 投影机+音响巧搭配
  18. 【GEEK】win10下cmd美化
  19. Tomcat:The valid characters are defined in RFC 7230 and RFC 3986 问题处理
  20. 学linux好找工作吗?未来可以从事什么岗位?

热门文章

  1. 兆骑科创双创活动承办,企业落地孵化,招才引智
  2. 需要更新的以前的visual studio 2010实例Microsoft Visual Studio 2010 Service Pack 1(exe)
  3. 寒风冷雨,东湖吹风记
  4. 机器学习中的数学——距离定义(十一):汉明距离(Hamming Distance)
  5. Windows dhcp server option43选项配置简介
  6. 学校让考的计算机一级b,关于职业学校《全国计算机等级考试一级B教程》教学方法的探讨...
  7. 山东省2023年春季高考技能测试电子技术类专业试题
  8. android viewpager2,viewpager2原理和使用
  9. 逻辑思维类面试题汇编(7)
  10. g++ -L 和-l -I参数