网络流+二分。

n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边。

二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数。

恩,看起来没什么毛病。

然后狂WA不止。调了一晚上。拍了大半晚上,发现网上找的拿来拍的程序是个WA的。。。我还能说些什么呢。。

这时候才发现我应该算点到线段的距离而不是直线。保持微笑。

原来这题还有一个计算几何的tag?

算点到直线的距离d,点到线段两点的距离,短的为l,长的为r。

勾股定理算出tmp=sqrt(r*r-d*d);若是tmp小于线段长度,则返回d,否则返回l;

//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
typedef long long LL;
const int maxn=**+;
using namespace std;
int ans,s,t,n,u,v,w,ecnt=,fir[maxn],d[maxn],cur[maxn],c[maxn],p[maxn],ed[maxn];
struct wuyao{
int x,y,r,t;
}wy[maxn],jl[maxn],sm[maxn];
struct edge {
int from,to,cap,flow,nxt;
edge(){}
edge(int from,int to,int cap,int flow,int nxt):from(from),to(to),cap(cap),flow(flow),nxt(nxt){}
}e[maxn];
void add(int u,int v,int w) {
e[++ecnt]=edge(u,v,w,,fir[u]);
e[++ecnt]=edge(v,u,,,fir[v]);
fir[u]=ecnt-; fir[v]=ecnt;
}
queue<int>que;
void bfs(int s,int t) {
for(int i=;i<=n;i++) d[i]=n;
d[t]=;
que.push(t);
while(!que.empty()) {
int x=que.front() ;que.pop();
for(int i=fir[x];i;i=e[i].nxt)
if(d[e[i].to]==n&&e[i].flow==e[i].cap) {
d[e[i].to]=d[x]+;
que.push(e[i].to);
}
}
}
int cal(int s,int t) {
int fl=INF;
for(int x=t;x!=s;x=e[p[x]].from)
fl=min(fl,e[p[x]].cap-e[p[x]].flow);
for(int x=t;x!=s;x=e[p[x]].from) {
e[p[x]].flow+=fl;
e[p[x]^].flow-=fl;
}
return fl;
}
int maxflow(int s,int t) {
bfs(s,t);
int res=;
for(int i=;i<=n;i++) cur[i]=fir[i],c[d[i]]++;
for(int x=s;d[x]<n;) {
if(x==t) {
res+=cal(s,t);
x=s;
}
int ok=;
for(int &i=cur[x];i;i=e[i].nxt)
if(d[e[i].to]+==d[x]&&e[i].cap>e[i].flow){
p[x=e[i].to]=i;
ok=; break;
}
if(!ok) {
cur[x]=fir[x]; int M=n;
for(int i=cur[x];i;i=e[i].nxt)
if(e[i].cap>e[i].flow)
M=min(M,d[e[i].to]+);
if(!(--c[d[x]])) break;
c[d[x]=M]++;
if(x!=s) x=e[p[x]].from;
}
}
return res;
} double dis(int x,int y,int xx,int yy) {
return sqrt((double)(x-xx)*(x-xx)+(double)(y-yy)*(y-yy));
} double Dis(int x,int y,double A,double B,double C) {
return fabs((A*x+B*y+C))/sqrt(A*A+B*B);
} int wys,jls,sms;
double yyj;
int check(int ti) {
for(int i=;i<=ecnt;i++) e[i].flow=;
for(int i=;i<=wys;i++) {
int fl=ti/wy[i].t+;
e[ed[i]].cap=fl;
}
return (maxflow(s,t)==jls);
} int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout); scanf("%d%d%d",&wys,&jls,&sms);
n=wys+jls+; s=n-; t=n;
for(int i=;i<=wys;i++) {
scanf("%d%d%d%d",&wy[i].x,&wy[i].y,&wy[i].r,&wy[i].t);
add(s,i,); ed[i]=ecnt-;
}
for(int i=;i<=jls;i++) {
scanf("%d%d",&jl[i].x,&jl[i].y);
add(wys+i,t,);
}
for(int i=;i<=sms;i++)
scanf("%d%d%d",&sm[i].x,&sm[i].y,&sm[i].r); for(int i=;i<=wys;i++) {
for(int j=;j<=jls;j++)
if((yyj=dis(wy[i].x,wy[i].y,jl[j].x,jl[j].y))<=(double)wy[i].r) {
double A=(wy[i].y-jl[j].y),B=jl[j].x-wy[i].x,C=wy[i].x*jl[j].y-wy[i].y*jl[j].x;
if(i==) {
int debug=;
}
if(!sms)
add(i,wys+j,);
for(int k=;k<=sms;k++) {
double tmp;
double ddx=Dis(sm[k].x,sm[k].y,A,B,C);
double zb=dis(wy[i].x,wy[i].y,sm[k].x,sm[k].y),yb=dis(jl[j].x,jl[j].y,sm[k].x,sm[k].y);
if(zb<yb) swap(zb,yb);
double woc=sqrt(zb*zb-ddx*ddx);
tmp=woc<=yyj?ddx:yb;
if(tmp<=(double)sm[k].r) break;
if(k==sms)
add(i,wys+j,);
}
}
} int l=,r=4e6+;
if(!check(r)) ans=-;
else {
while(l<=r) {
int mid=(l+r)>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
}
printf("%d\n",ans);
return ;
}

题面

BZOJ 1822[JSOI2010]Frozen Nova 冷冻波的更多相关文章

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

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

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

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

  3. Bzoj1822 [JSOI2010]Frozen Nova 冷冻波

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

  4. 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

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

  5. BZOJ1822 [JSOI2010]Frozen Nova 冷冻波 二分+最大流

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1822 题解 好久没做网络流的,都没有想到网络流... 首先暴力判断一下一个巫妖和一个精灵之间能 ...

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

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

  7. bzoj1822: [JSOI2010]Frozen Nova 冷冻波网络流

    思路比较显然:二分答案,流流流 但是实现的时候感觉自己数学捉急.. 一开始算了个直线到点距离.... 应该是线段到点距离 #include <bits/stdc++.h> #define ...

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

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

  9. BZOJ1822 Frozen Nova 冷冻波

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

随机推荐

  1. CSS——溢出文字隐藏

    溢出的文字隐藏 word-break:自动换行 normal 使用浏览器默认的换行规则. break-all 允许在单词内换行. keep-all 只能在半角空格或连字符处换行. 主要处理英文单词 w ...

  2. thinkphp 模板继承

    模板继承是一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区 ...

  3. win10 mysql5.7指定某个配置文件启动

    点击开始菜单,搜索cmd.exe,左击以管理员身份运行 C:\Users\Administrator>cd C:\Program Files\MySQL\MySQL Server 5.7\bin ...

  4. C#实现程序开机启动

    如何用c#实现开机启动?其实用c#实现程序的开机启动大致有两种方法,就是写入注册表或者采用服务程序,最近一直研究着用C#来操作注册表,下面介绍的方法便是用注册表来实现程序随开机启动(高手就不用看了,嘿 ...

  5. Jan&Feb 工作总结

    一.工作任务: 熟悉dcbi项目(运维经分系统),完成指定需求. 熟悉bi项目(数据分析平台),完成指定需求. steel circus 主机游戏官网制作. 一拳超人游戏预注册页wap手机端制作. 二 ...

  6. 6_2.springboot2.x整合Druid和配置数据源监控

    简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss Data ...

  7. <每日一题>题目30:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来

    def select_d(list,d): # list = sorted(list) sum = {} for i in list: if i+d in list: sum[i] = i+d ret ...

  8. 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容

    原文:使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群19106581 ...

  9. AngularJs 报错 Error: [$parse:lexerr]

    参考:https://www.cnblogs.com/fangshidaima/p/6048071.html 错误: 根据错误找到报错行: $scope.$apply($scope.param1 = ...

  10. CodeForces 258D Little Elephant and Broken Sorting(期望)

    CF258D Little Elephant and Broken Sorting 题意 题意翻译 有一个\(1\sim n\)的排列,会进行\(m\)次操作,操作为交换\(a,b\).每次操作都有\ ...