bzoj1822: [JSOI2010]Frozen Nova 冷冻波网络流
思路比较显然:二分答案,流流流
但是实现的时候感觉自己数学捉急。。
一开始算了个直线到点距离。。。。
应该是线段到点距离
#include <bits/stdc++.h>
#define sqr(x) ((x)*(x))
#define MAXN 50000
#define TO (n+m+2)
#define FROM (n+m+1)
#define PO (n+m+2)
#define INF 2000000000
#define mid (l+r>>1)
using namespace std;
int n,m,k,LI=,ans;
int to[MAXN],w[MAXN],nex[MAXN],fir[MAXN];
int h[MAXN],qq[MAXN],flo[MAXN],id[MAXN];
int ti[MAXN],x[MAXN],y[MAXN],X[MAXN],Y[MAXN],r[MAXN],p[MAXN],q[MAXN],R[MAXN];
void add(int p,int q,int o)
{
to[LI]=q;w[LI]=o;nex[LI]=fir[p];fir[p]=LI;LI++;
to[LI]=p;w[LI]=;nex[LI]=fir[q];fir[q]=LI;LI++;
}
bool bfs()//计算层次图
{
int head=-,tail=;
for(int i=;i<=PO;i++) h[i]=-;
qq[]=FROM;h[FROM]=;// h[i]:点i的层数
while(head!=tail)
{
int x=qq[++head];
for(int i=fir[x];i;i=nex[i])
if(flo[i]&&h[to[i]]==-)
{
h[to[i]]=h[x]+;
qq[++tail]=to[i];
}
}
return h[TO]!=-;
}
int dfs(int x,int f)//增广路:到点x最大容量为 f
{
if(x==TO)return f;
int w,used=;
for(int i=fir[x];i;i=nex[i])
if(h[to[i]]==h[x]+)
{
w=dfs(to[i],min(flo[i],f-used));
flo[i]-=w; flo[i^]+=w;
used+=w;if(used==f)return f;
}
if(!used)h[x]=-;
return used;
}
int dinic() //%usqwedf
{
int ans=;
while(bfs())
ans+=dfs(FROM,1e9);
return ans;
}
bool ok(int time)
{
for(int i=;i<=n;i++)
w[id[i]]=time/ti[i]+;
for(int i=;i<LI;i++)
flo[i]=w[i];
return(dinic()==m);
}
int main()
{
// freopen("1.in","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
scanf("%d%d%d%d",&x[i],&y[i],&r[i],&ti[i]);
for(int i=;i<=m;i++)
scanf("%d%d",&X[i],&Y[i]);
for(int i=;i<=k;i++)
scanf("%d%d%d",&p[i],&q[i],&R[i]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
bool flag=sqr(x[i]-X[j])+sqr(y[i]-Y[j])<=sqr(r[i]);
if(!flag) continue;
long long a=y[i]-Y[j],b=X[j]-x[i],c=x[i]*Y[j]-y[i]*X[j];
for(int o=;o<=k;o++)
if(sqr(a*p[o]+b*q[o]+c)<=sqr(R[o])*(sqr(a)+sqr(b)) && (sqr(x[i]-p[o])+sqr(y[i]-q[o])<=sqr(R[o]) || sqr(X[j]-p[o])+sqr(Y[j]-q[o])<=sqr(R[o])))
{
flag=;
break;
}
if(flag)
add(i,j+n,);
}
for(int i=;i<=m;i++)
add(i+n,TO,);
for(int i=;i<=n;i++)
id[i]=LI,add(FROM,i,);
int l,r;
for(l=,r=;l<r;)
if(ok(mid)) r=mid;else l=mid+;
if(ok(l))
printf("%d\n",l);
else
puts("-1");
return ;
}
bzoj1822: [JSOI2010]Frozen Nova 冷冻波网络流的更多相关文章
- Bzoj1822 [JSOI2010]Frozen Nova 冷冻波
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1933 Solved: 608 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖 ...
- BZOJ1822 [JSOI2010]Frozen Nova 冷冻波 二分+最大流
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1822 题解 好久没做网络流的,都没有想到网络流... 首先暴力判断一下一个巫妖和一个精灵之间能 ...
- 【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波
用三角形面积什么的算算点到直线的距离之类……其实相切的情况是可行的……剩下的就跟某SDOI2015一样了. #include<cstdio> #include<cmath> # ...
- 【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流
[BZOJ1822][JSOI2010]Frozen Nova 冷冻波 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀 ...
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 585 Solved: 175[Subm ...
- 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
- BZOJ 1822[JSOI2010]Frozen Nova 冷冻波
网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止 ...
- BZOJ1822 Frozen Nova 冷冻波
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
随机推荐
- Meta viewport 学习整理
The meta viewport tag contains instructions to the browser in the matter of viewports and zooming. I ...
- array_2.array_rand
从数组中随机取出一个或多个单元 <?php $arr = [1, 2, 3]; $rand = array_rand($arr, 2); var_dump($rand);
- linux命令学习笔记(45):free 命令
free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的 工具中,free命令是最经常使用的命令之一. .命令格式: free [参 ...
- Map功能简化Python并发代码
<转摘>Python 并行任务技巧 支持Map并发的包文件有两个: Multiprocessing,还有少为人知的但却功能强大的子文件 multiprocessing.dummy. Dum ...
- 一:AMQP协议标准简单介绍
一:AMQP协议?--->AMQP 是 Advanced Message Queuing Protocol,即高级消息队列协议.和前面罗列的技术不同,AMQP 是一个标准化的消息中间件协议--- ...
- Python手记
字符串的拼接 1.“+”,如果是字符和数字相连,要使用str()函数对于数字进行字符转化: 2.join() 3.",",链接的两个字符串之间用空格做关联 4.占位符 tmp += ...
- NOI.AC 32 Sort——分治
题目:http://noi.ac/problem/32 从全是0和1的情况入手,可以像线段树一样分治下去,回到本层的时候就是左半部的右边是1,右半部的左边是0,把这两部分换一下就行.代价和时间一样是n ...
- linux 中spfvim安装
1. 安装 git 1.1 安装依赖的包: curl curl-devel zlib-devel openssl-devel perl c ...
- Adobe Flash Player 27 on Fedora 27/26, CentOS/RHEL 7.4/6.9
This is guide, howto install Adobe Flash Player Plugin version 27 (32-bit and 64-bit) with YUM/DNF o ...
- POCO库中文编程参考指南(11)如何使用Reactor框架?
1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调 ...