bzoj 1822 冷冻波
题目大意:
在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵
我们认为,巫妖和小精灵都可以看成是平面上的点。
当巫妖和小精灵之间的直线距离不超过R,且巫妖和小精灵的连线与任何树木都没有公共点,巫妖就可以瞬间杀灭一个小精灵。
在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放
不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。
若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵
思路:
最大流建图还是比较好想的
但是答案需要二分,然后用最大流判断
连边的时候每个巫妖和它可以消灭的小精灵连一条流量为一的边
每个小精灵和超级汇连一条流量为1的边
每个巫妖和超级源连一条时间(二分得到)/冷却时间+1的流量的边
但是如何判断哪些巫妖和小精灵之间连边呢
需要计(jie)算(xi)几何判断
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define inf 2139062143
#define ll long long
#define MAXN 420
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return x*f;
}
int n,m,k,r[MAXN],cd[MAXN],R[MAXN],d[MAXN];
struct node {int x,y;}g[MAXN],h[MAXN],tr[MAXN];
double dis(int x1,int y1,int x2,int y2) {return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int check(node a,node b,int i)
{
if(dis(a.x,a.y,b.x,b.y)>=r[i]) return ;
int A=b.y-a.y,B=a.x-b.x,C=b.x*a.y-a.x*b.y;
for(int l=;l<=k;l++)
{
double dst=fabs(A*tr[l].x+B*tr[l].y+C)/sqrt(A*A+B*B);
double k1,b1,b2,b3;
if(a.x==b.x) b1=a.y,b2=b.y,b3=tr[l].y;
else if(a.y==b.y) b1=a.x,b2=b.x,b3=tr[l].x;
else k1=B/A,b1=a.y-k1*a.x,b2=b.y-k1*b.x,b3=tr[l].y-k1*tr[l].x;
if((b3-b1)*(b3-b2)<=) if(dst<=R[l]) return ;
if(abs(b3-b1)>abs(b3-b2)) if(dis(b.x,b.y,tr[l].x,tr[l].y)<=R[l]) return ;
else if(dis(a.x,a.y,tr[l].x,tr[l].y)<=R[l]) return ;
}
return ;
}
struct dinic
{
int fst[MAXN],nxt[MAXN*MAXN],to[MAXN*MAXN],val[MAXN*MAXN],mp[MAXN][MAXN],cnt,s,t;
void mem() {memset(fst,0xff,sizeof(fst));cnt=-;}
void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
void build(int x)
{
mem();
for(int i=;i<=n;i++) {add(s,i,x/cd[i]+);add(i,s,);}
for(int i=;i<=m;i++) {add(n+i,t,);add(t,n+i,);}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]) {add(i,n+j,);add(n+j,i,);}
}
int vis[MAXN],tot,cur[MAXN],dep[MAXN],q[MAXN];
int bfs()
{
int l=,r=;
memset(dep,0xff,sizeof(dep));
vis[t]=++tot,q[++r]=t;
while(l<=r)
{
int x=q[l++];
for(int i=fst[x];i!=-;i=nxt[i])
if(val[i^]&&vis[to[i]]!=tot)
{
vis[to[i]]=tot,dep[to[i]]=dep[x]+,q[++r]=to[i];
if(to[i]==s) return ;
}
}
return vis[s]==tot;
}
int dfs(int x,int a)
{
if(x==t||!a) return a;
int flow=,f;
for(int& i=cur[x];i!=-;i=nxt[i])
{
if(val[i]&&dep[to[i]]==dep[x]-&&(f=dfs(to[i],min(a,val[i]))))
{
val[i]-=f,val[i^]+=f,flow+=f,a-=f;
if(!a) break;
}
}
return flow;
}
int solve()
{
int ans=;int f;
while(bfs())
{
for(int i=;i<=n+m+;i++) cur[i]=fst[i];
while(f=dfs(s,inf)) ans+=f;
}
return ans;
}
}D;
int main()
{
n=read(),m=read(),k=read();int mx=-;
for(int i=;i<=n;i++) g[i].x=read(),g[i].y=read(),r[i]=read(),cd[i]=read(),mx=max(mx,cd[i]);
for(int i=;i<=m;i++) {h[i].x=read(),h[i].y=read();D.add(n+i,n+m+,);D.add(n+m+,n+i,);}
for(int i=;i<=k;i++) tr[i].x=read(),tr[i].y=read(),R[i]=read();
D.s=,D.t=n+m+;int f;
for(int j=;j<=m;j++)
{
f=;
for(int i=;i<=n;i++)
{
D.mp[i][j]=check(g[i],h[j],i);
if(D.mp[i][j]) f=;
}
if(!f) {puts("-1");return ;}
}
int l=,r=m*mx,mid;
int ans=inf;
while(l<=r)
{
mid=(l+r)>>;
D.build(mid);
if(D.solve()==m) ans=min(ans,mid),r=mid-;
else l=mid+;
}
printf("%d",ans);
}
对于计算几何非常不熟练,只能用解析几何
写完的时候因为忘记了有n+m+2个点调了好久以及循环的时候把循环的变量写没了
bzoj 1822 冷冻波的更多相关文章
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 585 Solved: 175[Subm ...
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
- 【BZOJ1822】[JSOI2010]冷冻波(二分,网络流)
[BZOJ1822][JSOI2010]冷冻波(二分,网络流) 题面 BZOJ 洛谷 题解 先预处理每个巫妖可以打到哪些小精灵,然后二分答案,网络流判定即可. #include<iostream ...
- BZOJ1822 Frozen Nova 冷冻波
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...
- P4048 [JSOI2010]冷冻波
出题人你tm搞笑呢,冰霜新星翻成冷冻波,而且tm就只能打一只小精灵???巫妖王都想来砍死你 首先要搞出每个巫妖能不能打到每一个小精灵,然后二分时间,就能算出每个巫妖可以打的次数,网络流check即可 ...
- Bzoj1822 [JSOI2010]Frozen Nova 冷冻波
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1933 Solved: 608 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖 ...
- 【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流
[BZOJ1822][JSOI2010]Frozen Nova 冷冻波 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀 ...
- BZOJ 1822 Frozen Nova 冷冻波(最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1822 题意:WJJ喜欢“魔兽争霸”这个游戏.在 游戏中,巫妖是一种强大的英雄,它的技能F ...
- BZOJ 1822[JSOI2010]Frozen Nova 冷冻波
网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止 ...
随机推荐
- 计算机网络(四)--全世界最好的TCP基础知识讲解
TCP传输的数据单元是报文段,报文段分为首部.数据两部分 TCP首部 首部的前20字节是固定长度,后面的4n字节根据需要增加的选项 字段解释:图中标示单位为bit,不是byte 1.源端口.目的端口: ...
- <东方梦符祭> N2无尽40波通关
先上图吧 阵容:纯粹 + 伪魔法队 主C:神妈 露米娅(我觉得不厉害了) 灵梦 控制:琪露诺 + 蕾蒂 永江依玖(听说很厉害 没培育满 没看到效果) 挂件:铃仙挂机 帕秋莉 大妖精(链神妈) 圣今天才 ...
- eBPF监控工具bcc系列一启航
eBPF监控工具bcc系列一启航 在eBPF篇中,我们知道虽然可用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码.工作有些麻烦,于是就有人设计了 B ...
- php第二十三节课
XML XML:页面之间传递数据,跨平台传递 HTML:超文本标记语言,核心标签 XML特点:1.标签名可以自己定义2.有且只有一个根3.大小写敏感4.标签必须完整 <!DOCTYPE html ...
- MFC 课程总结
<基于MFC框架开发>马志国 1491989781 MFC课程的组成 1.1 MFC应用程序的组成部分.执行机制和执行流程(10.5天). 1.2 Windows平台上的数据库访问技术(1 ...
- 洛谷 P1280 尼克的任务 (线性DP)
题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...
- PYGAME学习笔记_01
01_使用PYGAME创建图形窗口 1.1_游戏的初始化和退出 pygame.init() 写入并初始化所有PYGAME模块,使用其他模块之前,必须先调用init方法 pygame.quit() 卸载 ...
- Unity常用常找(二)
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51315050 作者:car ...
- 被 idea 坑了的记录篇
这个星期真的是波折的一周~~~~ 不得不吐槽下无敌坑的自己了,社会我娜姐,坑起来连自己都坑~~ 其实这也不全算我自己的坑,我只是卸载了idea,重新装了一下而已,很神奇的把idea的几个坑全撞了一遍( ...
- Shiro_DelegatingFilterProxy
1.DelegatingFilterProxy实际上是Filter的一个代理对象.默认情况下,Spring会到IOC容器中查找与<filter-name>对应的filter bean.也可 ...