考虑网络流,二分时间,源点向巫妖连流量为攻击次数的边,把每个巫妖向他能打的小精灵连一条流量为一的边,每个小精灵向汇点连一条边。

预处理每个小精灵能被那些巫妖打,这道题好像视线与树相切也算能打(雾。

#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+100,maxm=1e6+100,inf=0x7fffffff;
struct Point{
double x,y;
Point(double xx=0,double yy=0){
x=xx,y=yy;
}
}tre[maxn],a[maxn],b[maxn];
struct Vector{
double x,y;
Vector(double xx=0,double yy=0){
x=xx,y=yy;
}
};
struct Grafh{
int v[maxm],w[maxm],nex[maxm],head[maxn],num;
void add(int x,int y,int z){
v[++num]=y;
w[num]=z;
nex[num]=head[x];
head[x]=num;
v[++num]=x;
w[num]=0;
nex[num]=head[y];
head[y]=num;
}
void clean(){
memset(head,0,sizeof(head));
num=1;
}
Grafh(){num=1;}
}g,h;
int dcmp(double x){return fabs(x)<1e-9?0:(x>0?1:-1);}
Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
double operator * (Vector a,Vector b){return a.x*b.y-a.y*b.x;}
double dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
double len(Vector a){return sqrt(dot(a,a));}
double dists(Point p,Point a,Point b){
Vector v1=b-a,v2=p-a,v3=p-b;
if(dcmp(dot(v1,v2))<=0) return len(v2);
else if(dcmp(dot(v1,v3))>=0) return len(v3);
return fabs(v1*v2/len(v1));
}
int n,m,p;
int cc[maxn],s,t;
int cur[maxn],tim[maxn];
double ar[maxn],tr[maxn];
queue<int>q;
bool bfs(){
memset(cc,0,sizeof(cc));
cc[s]=1;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=h.head[x];i;i=h.nex[i])
if(h.w[i]&&!cc[h.v[i]])
cc[h.v[i]]=cc[x]+1,q.push(h.v[i]);
}
return cc[t];
}
int dfs(int x,int ll){
if(x==t) return ll;
for(int &i=cur[x];i;i=h.nex[i])
if(h.w[i]&&cc[h.v[i]]==cc[x]+1){
int pp=dfs(h.v[i],ll>h.w[i]?h.w[i]:ll);
if(pp){
h.w[i]-=pp;
h.w[i^1]+=pp;
return pp;
}
}
return 0;
}
int dinic(){
int maxl=0,ll;
while(bfs()){
memcpy(cur,h.head,sizeof(cur));
while(ll=dfs(s,inf))
maxl+=ll;
}
return maxl;
}
bool getdist(){
s=0,t=n+m+1;
for(int i=1;i<=m;i++){
bool cz=0;
for(int j=1;j<=n;j++)
if(dcmp(len(a[j]-b[i])-ar[j])<=0){
bool ok=1;
for(int k=1;k<=p;k++)
if(dcmp(dists(tre[k],b[i],a[j])-tr[k])<0){
ok=0;
break;
}
if(ok){
g.add(j,i+n,inf);
cz=1;
}
}
if(!cz){
printf("-1\n");
return 1;
}
}
for(int i=1;i<=m;i++)
g.add(i+n,t,1);
return 0;
}
bool check(int x){
h=g;
for(int i=1;i<=n;i++)
h.add(s,i,x/tim[i]+1);
if(dinic()==m) return 1;
return 0;
}
void work(){
int l=0,r=4000001,mid,ans=0;
while(l<r){
mid=l+r>>1;
if(check(mid))
ans=mid,r=mid;
else
l=mid+1;
}
printf("%d\n",ans);
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf%d",&a[i].x,&a[i].y,&ar[i],&tim[i]);
for(int i=1;i<=m;i++)
scanf("%lf%lf",&b[i].x,&b[i].y);
for(int i=1;i<=p;i++)
scanf("%lf%lf%lf",&tre[i].x,&tre[i].y,&tr[i]);
if(getdist()) return 0;
work();
return 0;
}

Luogu-4048 [JSOI2010]冷冻波的更多相关文章

  1. 【BZOJ1822】[JSOI2010]冷冻波(二分,网络流)

    [BZOJ1822][JSOI2010]冷冻波(二分,网络流) 题面 BZOJ 洛谷 题解 先预处理每个巫妖可以打到哪些小精灵,然后二分答案,网络流判定即可. #include<iostream ...

  2. P4048 [JSOI2010]冷冻波

    出题人你tm搞笑呢,冰霜新星翻成冷冻波,而且tm就只能打一只小精灵???巫妖王都想来砍死你 首先要搞出每个巫妖能不能打到每一个小精灵,然后二分时间,就能算出每个巫妖可以打的次数,网络流check即可 ...

  3. 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 585  Solved: 175[Subm ...

  4. Bzoj1822 [JSOI2010]Frozen Nova 冷冻波

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1933  Solved: 608 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖 ...

  5. 【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流

    [BZOJ1822][JSOI2010]Frozen Nova 冷冻波 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀 ...

  6. BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图

    这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...

  7. BZOJ1822 Frozen Nova 冷冻波

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...

  8. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  9. 【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波

    用三角形面积什么的算算点到直线的距离之类……其实相切的情况是可行的……剩下的就跟某SDOI2015一样了. #include<cstdio> #include<cmath> # ...

随机推荐

  1. unity4.6 Beta版 UI控件之Button

    近期需求,须要用到4.6版本号uGui了,所以抽时间来学习学习,就UI控件在Unity工具里创建预设这块来说相比較于NGUI,我认为是没有什么太大的差别的. 比方:Canvas--Camera . T ...

  2. The TTY demystified

    http://www.linusakesson.net/programming/tty/index.php The TTY demystified Real teletypes in the 1940 ...

  3. [译]GLUT教程 - 整合代码7

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. ...

  4. GitHub 寻宝指南

    GitHub 寻宝指南 寻找 Demo 技术栈的关键字搜索,并按更新时间进行排序 生命有限 ,如若是每次我们尝试一个新的技术,总得自己编写一个个 Demo.编写多个 Demo,都得花去个半天八小时的时 ...

  5. 关于移动端border 1像素在不同分辨率下边显示粗细不一样的处理

    最近开发发现一个很有趣的问题  就是我如果给一个元素加上一个像素的 border 在不同的分辨率的情况下显示的不同 在高清屏幕(尤其是ios 喽 不鄙视国产) 据说在6plus下会变成3px  这个我 ...

  6. - WebStorm 转载【干货技术贴】之-mac下如何安装WebStorm + 破解

    写在前面 之前公司不忙的时候,用闲暇功夫想学习React-Native 苦于找不到一款好的代码编辑器,在广泛搜索以后,发现最适合的就是网页代码编辑器WebStrom,所以就尝试安装和破解,下面我将自己 ...

  7. CSS3 - 鼠标移入移出时改变样式

    1,使用伪类实现样式切换伪类是CSS2.1时出现的新特性,让许多原本需要JavaScript才能做出来的效果使用CSS就能实现.比如实现下面的鼠标悬停效果,只要为:hover伪类应用一组新样式即可.当 ...

  8. 微信小程序之如何注册微信小程序

    所有文章均是CSDN博客所看,已按照作者要求,注明出处了,感谢作者的整理! 博客文章地址:http://blog.csdn.net/michael_ouyang/article/details/546 ...

  9. C语言基础知识【数据类型】

    C 数据类型1.在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式.2.C 中的类型可分为以下几种:序号    类 ...

  10. lua(注册c库)

    #include <iostream> #include <string.h> extern "C" { #include "lua-5.2.2/ ...