网络流+二分。

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. csps模拟87888990部分题解

    题面:https://www.cnblogs.com/Juve/articles/11752338.html https://www.cnblogs.com/Juve/articles/1175241 ...

  2. 线段树离散化+区间更新——cf1179C好题

    绝对是很好的题 把问题转化成当第i个询问的答案是数值x时是否可行 要判断值x是否可行,只要再将问题转化成a数组里>=x的值数量是否严格大于b数组里的>=x的值 那么线段树叶子结点维护对于值 ...

  3. shell启停服务脚本模板

    一. 启动脚本模板:符合幂等性 如果该服务已经启动,再次调用该脚本,不会报错,也就是说可以反复多次调用,另外启动成功返回 一个参数,提供给自动发布平台校验该服务是否启动 #!/bin/bash ins ...

  4. Han Xin and His Troops(扩展中国剩余定理 Python版)

    Han Xin and His Troops(扩展中国剩余定理 Python版) 题目来源:2019牛客暑期多校训练营(第十场) D - Han Xin and His Troops 题意:   看标 ...

  5. ims注册与注销

    ims注册流程: 步骤1:当IMS和SIM访问已经就绪时,IMC将在满足条件后触发IMS注册到IMCB.步骤2.3:IMCB请求IMSA/IMSM获取IMS PDN和P-CSCF,然后触发VoLTE ...

  6. 7_1.springboot2.x启动配置原理_1.创建SpringApplication对象

    环境准备 springboot2.1.9.idea2019. pom.xml 解析 几个重要的事件回调机制 配置在META-INF/spring.factories ApplicationContex ...

  7. python函数基础(函数的定义和调用)

    函数的定义 python定义函数使用def关键字 return[表达式]语句用于退出函数,选择性的向调用方返回一个表达式,不带参数值的return语句返回none def 函数名(参数列表): 函数体 ...

  8. java_迭代器

    java的迭代器(Iterator): 一个可迭代的对象调用iterator可以得到一个迭代器对象 HasNext:判断是否还有下一个元素 next:返回迭代的元素 步骤: public static ...

  9. netty 私有协议栈

    通信协议从广义上区分,可以分为公有协议和私有协议.由于私有协议的灵活性,它往往会在某个公司或者组织内部使用,按需定制,也因为如此,升级起来会非常方便,灵活性好.绝大多数的私有协议传输层都基于TCP/I ...

  10. 创建你的 /proc 文件

    一旦你有一个定义好的 read_proc 函数, 你应当连接它到 /proc 层次中的一个入口项. 使用一个 creat_proc_read_entry 调用: struct proc_dir_ent ...