luogu链接:https://www.luogu.org/problemnew/show/P4048
bzoj链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1822

冷冻波

题目描述

WJJ喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是平面上的点。

当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵。

在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。

现在巫妖的头目想知道,若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?

输入输出格式
输入格式:

输入文件第一行包含三个整数N、M、K(N,M,K<=200),分别代表巫妖的数量、小精灵的数量和树木的数量。

接下来N行,每行包含四个整数x, y, r, t,分别代表了每个巫妖的坐标、攻击范围和施法间隔(单位为秒)。

再接下来M行,每行两个整数x, y,分别代表了每个小精灵的坐标。

再接下来K行,每行三个整数x, y, r,分别代表了每个树木的坐标。

输入数据中所有坐标范围绝对值不超过10000,半径和施法间隔不超过20000。

输出格式:

输出一行,为消灭所有小精灵的最短时间(以秒计算)。如果永远无法消灭所有的小精灵,则输出-1。

输入输出样例
输入样例#1:

2 3 1
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 10

输出样例#1:

5

题解

用计算几何求解巫妖和精灵间能否互相到达并以此建图,然后二分时间跑二分图匹配不断更新答案即可AC。

细节

注意先判断-1的情况,二分上界取maxcd*m,即冷却时间最长的巫妖单独杀死所有精灵的情况。更新时间后重新建图,超级源点到每个巫妖的边流量取time/cd[i]+1,即总时间除以冷却时间+1(因为在time=0的时候巫妖可以发射第一发Frozen Nova),其余边流量都为1。

代码略长大家实现的时候耐心一点,其实就是计算几何+dinic没什么思维难度,主要考代码实现。

另外,洛谷上第三个点博主的裸dinic被卡T了,加个当前弧优化快了500ms,把inline去掉又快了200ms(迷。。。),bzoj无压力过。

代码
#include<bits/stdc++.h>
#define db double
#define R register
using namespace std;
const int M=50005;
const db eps=1e-8;
struct edge{int to,fl;};
struct pt{int x,y,r;};
int sig(db x){return (x>eps)-(x<-eps);}
db dis(pt a,pt b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)*1.0);}
int operator * (pt a,pt b){return a.x*b.y-a.y*b.x;}
pt operator - (pt a,pt b){return (pt){a.x-b.x,a.y-b.y};}
db dis(pt p,pt a,pt b){return abs((a-p)*(b-p)*1.0/dis(a,b));}
pt lich[M],elv[M],tree[M];
edge ed[1000005];
vector<int>x[M];
int d[M],g=0,maxcd,cd[M],s,e,n,m,k,f;
bool vis[M];
char c;
void read(int &r)
{r=0;f=1;c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c))r=(r<<1)+(r<<3)+c-'0',c=getchar();r*=f;
}
void add(int a,int b)
{ed[g]=(edge){b,1};x[a].push_back(g++);ed[g]=(edge){a,0};x[b].push_back(g++);
}
int bfs(int s,int e)
{R int i;memset(d,0,sizeof(d));queue<int>dui;dui.push(s);d[s]=1;int f,hh,t;while(!dui.empty()){f=dui.front();dui.pop();for(i=x[f].size()-1;i>=0;--i){hh=x[f][i];t=ed[hh].to;if(d[t]||!ed[hh].fl)continue;d[t]=d[f]+1;dui.push(t);}}return d[e];
}
int dfs(int s,int e,int minn)
{R int i;if(s==e||!minn)return minn;int ans=0,hh,fl,to,tmp;for(i=x[s].size()-1;i>=0;--i){hh=x[s][i];fl=ed[hh].fl;to=ed[hh].to;if(d[to]!=d[s]+1||!fl)continue;tmp=dfs(to,e,min(minn-ans,fl));if(!tmp)continue;ed[hh].fl-=tmp;ed[hh^1].fl+=tmp;ans+=tmp;if(minn==tmp)break;}return ans;
}
int dinic()
{int ans=0;while(bfs(e,s))ans+=dfs(e,s,1e9);return ans;
}
void reb(int t)
{R int i;int hh;for(i=0;i<g;i+=2)ed[i].fl=1,ed[i+1].fl=0;for(i=x[0].size()-1;i>=0;--i)ed[x[0][i]^1].fl=t/cd[ed[x[0][i]].to]+1;
}
void in()
{R int i;read(n);read(m);read(k);e=n+m+1;for(i=1;i<=n;++i)read(lich[i].x),read(lich[i].y),read(lich[i].r),read(cd[i]),maxcd=max(maxcd,cd[i]);for(i=1;i<=m;++i)read(elv[i].x),read(elv[i].y);for(i=1;i<=k;++i)read(tree[i].x),read(tree[i].y),read(tree[i].r);
}
bool check(pt a,pt b)
{R int i;if(sig(dis(a,b)-a.r)>0) return 0;for(i=1;i<=k;++i){if(sig(dis(a,tree[i])-tree[i].r)<0)return 0;if(sig(dis(b,tree[i])-tree[i].r)<0)return 0;if((dis(tree[i],a,b)-tree[i].r)<0)return 0;}return 1;
}
void build()
{R int i,j;for(i=1;i<=n;++i)add(i,0);for(i=1;i<=n;++i)for(j=1;j<=m;++j)if(check(lich[i],elv[j])){add(j+n,i);vis[j]=1;}for(i=1;i<=m;++i)add(n+m+1,n+i);for(i=1;i<=m;++i)if(!vis[i]){printf("-1");exit(0);}
}
void ac()
{int le=0,ri=m*maxcd,mid,ans,p;while(le<=ri){mid=(le+ri)>>1;reb(mid);p=dinic();if(p==m){ans=mid;ri=mid-1;}else le=mid+1;}printf("%d",ans);
}
int main()
{in();build();ac();return 0;
}

BZOJ1822[JSOI2010] 冷冻波相关推荐

  1. (计算几何+二分+网络流)P4048 [JSOI2010]冷冻波

    P4048 [JSOI2010]冷冻波 思路: 首先我们可以假设如果有ansansans分钟的话,巫妖可以攻击⌊anst⌋+1\lfloor\cfrac{ans}{t}\rfloor+1⌊tans​⌋ ...

  2. P4048 [JSOI2010]冷冻波

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

  3. 停课集训 11.29

    今天效率及其低下,超困. 刷了一些网络流题,写成博客了 bzoj1565植物大战僵尸  博客 bzoj1822Frozen Nova 冷冻波 bzoj1834network 网络扩容 bzoj1877 ...

  4. MPB:华中师大谢波组-​​​微生物非标记定量蛋白质组学样品制备方法

    为进一步提高<微生物组实验手册>稿件质量,本项目新增大众评审环节.文章在通过同行评审后,采用公众号推送方式分享全文,任何人均可在线提交修改意见.公众号格式显示略有问题,建议电脑端点击文末阅 ...

  5. join和group by能一块用吗_冷冻一下地球能缓解温室效应吗?| No.171

    本计划将持续一百代人, 尽管, 我们不知道五千年后的夏日, 会是怎样的风景, 但从今天开始, 人类的勇气与坚毅, 将永刻于星空之下, 这一绝望与希望并存, 持续千年的控温之旅, 史称"冷冻地 ...

  6. 2208: [Jsoi2010]连通数(Trajan+bitset)

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2929  Solved: 1280 [Submit][Sta ...

  7. 离奇而迷人的量子物理学:人类也是一种波

    全文共4028字,预计学习时长11分钟 该图摄于2015年.众所周知,光同时具有波和粒两种属性.而物质粒子也具有波状属性却鲜有人知.即使体型像人类一样巨大的物体也具有波状属性,只不过很难进行度量. & ...

  8. 封城第14日,囤了一波好货

    封城第14天了,今天去小区里小卖部买了一箱啤酒和30个鸡蛋,一共花了110,这下明天开始可以吃菜喝酒了,夜宵也可以荷包蛋自由了.京东上看了一下大概价格在90左右,看来这个小卖部还是挺良心的,现在外面团 ...

  9. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

  10. 数字图像处理——第七章 小波和多分辨处理

    数字图像处理--第七章 小波和多分辨率处理 文章目录 数字图像处理--第七章 小波和多分辨率处理 写在前面 1 多分辨率处理 1.1 图像金字塔 1.2 多尺度和多分辨率的区别 2 小波 2.1 连续 ...

最新文章

  1. Linux常用命令的简单实用
  2. python写出的程序如何给别人使用-涨姿势!这些小技巧让小白也可以写出更优雅的Python代码!...
  3. Nginx 简单的cpu配置
  4. 幼儿园教师计算机教学计划,幼儿园教师教学计划
  5. 这些让人看瞎了的设计!实力证明,谁才是世界的最终boss!
  6. 计算机专业简历推荐信范文,个人简历自我推荐信范文【三篇】
  7. oracle 取mac地址,java执行命令,得到Mac地址
  8. mysql像plsql一样删除提交_MySQL学习-MySQL内置功能_事务操作
  9. linux 相关系统参数调优(特别针对网络传输,大量TIME_WAIT 的TCP状态的情况)
  10. android接口和type c对比,USB Type-C究竟比3.5mm音频接口好在哪里?
  11. python群发邮件 不进垃圾箱_邮件群发不进垃圾箱
  12. HttpCore和HttpClient
  13. Wireshark之流量包分析+日志分析 (护网:蓝队)web安全 取证 分析黑客攻击流程(下篇)
  14. 华钜同创:亚马逊开店六个日常运营小技巧
  15. README.md的内容格式
  16. Android IBinder机制简单介绍
  17. 一次递减代码matlab,DEA算法学习系列之三:一次性求解CCR模型所有DMU参数——效率、规模效益、有效性特征、调整值的matlab代码...
  18. 弘辽科技:拼多多商品访客数怎么提高?怎么访客越来越少?
  19. 全网最全的Kali工具大全
  20. OC--Foundation框架

热门文章

  1. 简单的idea非maven项目引入jar包
  2. sklearn聚类模型评估代码_2019-10-16 机器学习-聚类算法-K-means(K-均值聚类)-原理解析-代码实现(Scikit-learn)...
  3. 第 7 章 Neutron - 082 - 将 instance 连接到 first_local_net
  4. Nodejs与Java通用AES加解密
  5. nginx-反向代理笔记
  6. BUPT复试专题—密码(2009)
  7. elementui中el-upload自定义上传方法中遇到的问题
  8. 实现基于Keepalived高可用集群网站架构的多种方法
  9. Apache .htaccess Rewrite解决问号匹配的写法
  10. 使用docker部署redis中间件