bzoj 1822: [JSOI2010]Frozen Nova 冰霜新星
题意:
WJJ喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是平面上的点。 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵。 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。 现在巫妖的头目想知道,若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?
题解:
几何+二分+网络流。
这题很容易想到二分+网络流求答案。
但是难在怎么判断巫妖能不能打到011
注意,树木很粗壮。
首先有三种情况。
好吧也可以说是两种。
点到直线距离公式:
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 冰霜新星相关推荐
- BZOJ 1822 浅谈计算几何在网络流建模中的实际运用
世界真的很大 网络流是个神奇东西,可以用来解决很多意想不到的问题 但是做题久了,有套路了,大多数网络流也就不是那么难 只要建好模型,跑模板就OK 然后就会出现某些丧心病狂的出题人想到干脆卡一下建边之类 ...
- BZOJ 1822 Frozen Nova 霜冻新星
分配问题,将小精灵分配给巫妖,巫妖可接收量取决于时间长短,适应性取决于地形 预处理巫妖小精灵对的可行性,就是询问线段 \(AB\) 与圆 \(O\) 是否有交点 过点 \(O\) 作直线 \(AB\) ...
- BZOJ 2208[Jsoi2010]连通数
题面: 2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 3100 Solved: 1347 [Submit] ...
- BZOJ 1821: [JSOI2010]Group 部落划分 Group【MST】
1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MB Description 聪聪研究发现,荒岛野人总是过着群 ...
- bzoj 1821: [JSOI2010]Group 部落划分
1821: [JSOI2010]Group 部落划分 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 2484 Solved: 1165 [Submi ...
- BZOJ 1821 [JSOI2010] Group 部落划分 Group
最小生成森林? 个人感觉跟最小生成树差不多.需要分成k个联通块,让联通块之间距离最大就让联通块内距离尽可能小.一颗最小生成树是N-1条边,分成k个块需要切k-1条,就是一个n-k条边的最小生成森林,然 ...
- [BZOJ]1826: [JSOI2010]缓存交换 线段树
Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache.此时,如果Cache容量已满,则必须先从中删除一 ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- 图论复习(各类习题)
可以结合这篇博客进行复习:http://www.cnblogs.com/z360/p/7363034.html 一.强连通分量.缩点 习题: 洛谷--P2746 [USACO5.3]校园网Networ ...
最新文章
- sqlite3自增key设定(创建自增字段)
- 在AE10.1环境下调试其他版本的程序
- Hadoop自带WordCount.java程序
- 招商银行的AI野心:转型金融科技公司?
- 守卫者的挑战(guard)
- CF1612G Max Sum Array
- 图象关于y轴对称是什么意思_数学概念丨“图象”与“图像”是有区别的 ,你知道吗?...
- cario java_Cairo图形库 概述
- php 彩票系统,hsyl12141511 一套完整的PHP版彩票系统 - 下载 - 搜珍网
- pygame的最小系统
- php 获取上周日期_php 获取上一周下一周的日期列表
- AndroidStudio_android开发在线文档_在线API_蓝牙开发在线文档---Android原生开发工作笔记243
- 计算机网络(入门知识点最全整理)
- Unity制作的照片墙效果
- [10]STM32程序调试方法-STLINK调试和软件调试
- 《Software Testing》英文原著阅读 单词
- 点播系统加服务器加投影加音响,打造真实家庭影院 投影机+音响巧搭配
- 【GEEK】win10下cmd美化
- Tomcat:The valid characters are defined in RFC 7230 and RFC 3986 问题处理
- 学linux好找工作吗?未来可以从事什么岗位?
热门文章
- 兆骑科创双创活动承办,企业落地孵化,招才引智
- 需要更新的以前的visual studio 2010实例Microsoft Visual Studio 2010 Service Pack 1(exe)
- 寒风冷雨,东湖吹风记
- 机器学习中的数学——距离定义(十一):汉明距离(Hamming Distance)
- Windows dhcp server option43选项配置简介
- 学校让考的计算机一级b,关于职业学校《全国计算机等级考试一级B教程》教学方法的探讨...
- 山东省2023年春季高考技能测试电子技术类专业试题
- android viewpager2,viewpager2原理和使用
- 逻辑思维类面试题汇编(7)
- g++ -L 和-l -I参数