网络流+二分。

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. golang中net/http包的简单使用

    一.介绍 http包提供了http客户端和服务端的实现 Get,Head,Post和PostForm函数发出http.https的请求 程序在使用完回复后必须关闭回复的主体 #简单的访问网站,由于没有 ...

  2. HTML5能取代Android和iOS应用程序吗?

    大量新生移动设备的兴起,改变了互联网的未来.在技术的发展上,HTML5会取代App应用吗?或者说能够在多大程度上取代呢?在HTML5规范中,已经加入了相机.磁力罗盘.GPS信息的支持.很多新兴浏览器也 ...

  3. Linux课程---16、apache虚拟主机设置(如何在一台服务器上配置三个域名)

    Linux课程---16.apache虚拟主机设置(如何在一台服务器上配置三个域名) 一.总结 一句话总结:有三个网站www.lampym.com,bbs.lampym.com,mysql.lampy ...

  4. 在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误

    这是 微信支付-统一下单 接口文档 一.问题描述 在调用统一下单接口时,报mch_id参数格式错误,但商户ID确实是10位数字正确的,可就是一直报这个错误 返回的错误xml如下: 二.排错过程 1.多 ...

  5. Installer - Eclipse配置Data Source Explorer

    一.配置Oracle数据库连接 1.打开配置窗口 在[window]菜单中的[show windows]选择[other],在弹出的窗口中选择[Data Source Explorer]进行数据数据库 ...

  6. POJ-1502-MPI Maelstrom-dijkstra+输入处理

    BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distribute ...

  7. PAT甲级——A1120 Friend Numbers【20】

    Two integers are called "friend numbers" if they share the same sum of their digits, and t ...

  8. JVM规范

  9. Java开发系列-时间转换

    获取当前时间戳 // 获取当前的时间戳 long time = new Date().getTime(); 将字符串时间戳转成格式的时间字符串 Long timestrap = Long.parseL ...

  10. android 中的一些小问题

    1 TextView 在TableRow 中占满一行 要为TextView设置 android:layout_weight="1" 这个属性 2