【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流
【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波
Description
Input
Output
Sample Input
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 10
Sample Output
题解:先判断哪些巫妖能杀死哪些小精灵,然后做法就跟dance那道题一样,直接二分答案,然后跑网络流判定就好了
具体建边方法:设二分答案mid,巫妖攻击间隔t[i]
1.S->巫妖i 容量mid/t[i]+1
2.巫妖i->小精灵j 容量1
3.小精灵j->T 容量1
然后就是怎么判断巫妖i能不能打到小精灵j的问题了
你可能需要这个东西
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define n2(_) ((_)*(_))
using namespace std;
typedef long long ll;
int n,m,k,cnt,S,T,ans,tot;
int to[500010],next[500010],val[500010],head[500],d[500],map[210][210],pf[210],pt[210];
ll px[210],py[210],qx[210],qy[210],tx[210],ty[210],tr[210];
queue<int> q;
int dfs(int x,int mf)
{
if(x==T) return mf;
int i,k,temp=mf;
for(i=head[x];i!=-1;i=next[i])
{
if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
}
return mf-temp;
}
int bfs()
{
memset(d,0,sizeof(d));
while(!q.empty()) q.pop();
int i,u;
q.push(S),d[S]=1;
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i])
{
if(val[i]&&!d[to[i]])
{
d[to[i]]=d[u]+1;
if(to[i]==T) return 1;
q.push(to[i]);
}
}
}
return 0;
}
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int solve(int sta)
{
int i,j,l;
cnt=0,ans=0,tot=0;
memset(head,-1,sizeof(head));
S=0,T=n+m+1;
for(i=1;i<=n;i++) add(S,i,sta/pt[i]+1),tot+=sta/pt[i]+1;
if(tot<m) return 0;
for(i=1;i<=m;i++) add(i+n,T,1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(map[i][j])
add(i,j+n,1);
while(bfs()) ans+=dfs(S,1<<30);
return ans==m;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int i,j,l,r=0,mid;
for(i=1;i<=n;i++) scanf("%lld%lld%lld%lld",&px[i],&py[i],&pf[i],&pt[i]),r=max(r,pt[i]);
for(i=1;i<=m;i++) scanf("%lld%lld",&qx[i],&qy[i]);
for(i=1;i<=k;i++) scanf("%lld%lld%lld",&tx[i],&ty[i],&tr[i]);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(n2(qx[j]-px[i])+n2(qy[j]-py[i])>n2(pf[i])) continue;
for(l=1;l<=k;l++)
{
ll a=(tx[l]-px[i])*(qx[j]-px[i])+(ty[l]-py[i])*(qy[j]-py[i]),b,c=tr[l]*tr[l];
if(a<=0) b=n2(tx[l]-px[i])+n2(ty[l]-py[i]);
else if(a>=n2(qx[j]-px[i])+n2(qy[j]-py[i]))
b=n2(tx[l]-qx[j])+n2(ty[l]-qy[j]);
else b=n2((qy[j]-py[i])*tx[l]+(px[i]-qx[j])*ty[l]+qx[j]*py[i]-px[i]*qy[j]),
c*=n2(qy[j]-py[i])+n2(px[i]-qx[j]);
if(b<c) break;
}
if(l==k+1) map[i][j]=1;
}
}
l=0,r=4000001,mid;
while(l<r)
{
mid=l+r>>1;
if(solve(mid)) r=mid;
else l=mid+1;
}
if(r==4000001) printf("-1");
else printf("%d",r);
return 0;
}
【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流的更多相关文章
- 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能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 冷冻波网络流
思路比较显然:二分答案,流流流 但是实现的时候感觉自己数学捉急.. 一开始算了个直线到点距离.... 应该是线段到点距离 #include <bits/stdc++.h> #define ...
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 585 Solved: 175[Subm ...
- BZOJ 1822[JSOI2010]Frozen Nova 冷冻波
网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止 ...
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
- BZOJ1822 Frozen Nova 冷冻波
1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...
随机推荐
- Js随机生成指定长度字符串
function a(a) { var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&q ...
- 关于nodejs中npm命令没有反应的解决方法
最近在学习angularJS,正在做一个单页面应用,在安装nodejs之后,发现命令行传了输入npm -v能输出结果外,其余npm的任何操作都没有反应,一开始我以为是下载的比较慢,等了半小时还是没动静 ...
- WebDev.WebServer.exe,IIS ,IIS Express
调试ASP.NET程序的服务器有三种WebDev.WebServer.exe,IIS ,IIS Express,以下是从网上整理的他们各自的优缺点,记录以备查阅 1.ASP.NET开发服务器--Cas ...
- C语言指针的易错点
1.内存泄漏:申请的堆内存没有释放. 2.内存污染:前面非法操作使用内存(没有报错),后面写着写着就出错.如下代码: 当结构体中只有划线部分代码时,在编译器中编写不会报错,但此时已经造成非法操作内存, ...
- 【JavaScript】一个同步于本地时间的动态时间
这样例很easy.了解JavaScript之后就是几行的代码便可以完毕的事情. 可是对于一些未接触过JavaScript的人来说,差点儿非常大project的样子.然后在网上苦苦寻觅代码,之后在茫茫的 ...
- Atitit.检测文本文件的编码 自动获取文件的中文编码
Atitit.检测文本文件的编码 自动获取文件的中文编码 1 不能使用load来检测编码..1 2 使用convert来检测编码1 3 程序检测文本编码2 3.1 根据utf bom头2 3.2 检测 ...
- ArcGIS教程:将“替换为模型”工具用于多面体
替换为模型工具出如今 3D 编辑器 工具条上的 3D 编辑器菜单中.而且仅仅适用于多面体要素.使用此命令可将所选的一个或多个要素的几何替换为磁盘中所保存的 3D 模型文件.受支持的 3D 模型类型包含 ...
- JSON 常用数据转换
#endregion #region Json字符串转换为DataTable 实例方法 public DataTable JsonToDataTable(json) { DataTable dt= T ...
- 反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值
一.准备知识: Java反射机制 处理事务的JavaBean String的操作常用方法 二.模拟步骤 这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建 ...
- sourceInsight设置
复制后光标定格在行尾 Options -> Preferences -> Typing -> After pasting,select:at end of pasted text t ...