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

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define N 201
#define EPS 0.000001
#define INF 2147483647
struct Point{int x,y;}jl[N];
typedef Point Vector;
typedef double db;
Vector operator - (Point a,Point b){return (Vector){a.x-b.x,a.y-b.y};}
int Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
int sqr(int x){return x*x;}
db dis(Point a,Point b){return sqrt((db)(sqr(a.x-b.x)+sqr(a.y-b.y)));}
struct WY{Point p; int r,t;}wy[N];
struct SHU{Point p; int r;}shu[N];
int Abs(int x){return x<0?(-x):x;}
bool can[N][N];
int n,m,K;
bool Can_Attack(WY a,Point b)
{
if((db)a.r-dis(a.p,b)<EPS) return 0;
for(int i=1;i<=K;++i)
if((db)Abs(Cross(a.p-b,shu[i].p-b))/dis(a.p,b)-(db)shu[i].r<-EPS)
return 0;
return 1;
}
bool Must_Be_Attacked(int x)
{
for(int i=1;i<=n;++i)
if(can[i][x])
return 1;
return 0;
}
queue<int>q;
int nn,T,S;
int v[2*N*(N+1)],en,first[N*2+3],next[2*N*(N+1)],cap[2*N*(N+1)];
int d[N*2+3],cur[N*2+3];
void AddEdge(int U,int V,int Cap)
{
v[en]=V; cap[en]=Cap; next[en]=first[U]; first[U]=en++;
v[en]=U; cap[en]=0; next[en]=first[V]; first[V]=en++;
}
bool bfs()
{
memset(d,-1,sizeof(int)*(nn+1));
d[S]=0; q.push(S);
while(!q.empty())
{
int U=q.front(); q.pop();
for(int i=first[U];i!=-1;i=next[i])
if(cap[i]&&d[v[i]]==-1)
{
d[v[i]]=d[U]+1;
q.push(v[i]);
}
}
return d[T]!=-1;
}
int dfs(int U,int a)
{
if(U==T||(!a)) return a;
int Flow=0,f;
for(int i=first[U];i!=-1;i=next[i])
if(d[v[i]]==d[U]+1&&(f=dfs(v[i],min(a,cap[i]))))
{
cap[i]-=f;
cap[i^1]+=f;
Flow+=f;
a-=f;
if(!a)
break;
}
if(!Flow) d[U]=-1;
return Flow;
}
int MaxFlow()
{
int Flow=0,tmp;
while(bfs())
{
memcpy(cur,first,sizeof(int)*(nn+1));
while(tmp=dfs(S,INF)) Flow+=tmp;
}
return Flow;
}
bool check(int Lim)
{
memset(first,-1,sizeof(int)*(nn+1));
en=0;
for(int i=1;i<=n;++i) AddEdge(S,1+i,(!Lim)?1:(Lim/wy[i].t+1));
for(int i=1;i<=m;++i) AddEdge(1+n+i,T,1);
for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(can[i][j]) AddEdge(1+i,1+n+j,INF);
return MaxFlow()==m?1:0;
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;++i) scanf("%d%d%d%d",&wy[i].p.x,&wy[i].p.y,&wy[i].r,&wy[i].t);
for(int i=1;i<=m;++i) scanf("%d%d",&jl[i].x,&jl[i].y);
for(int i=1;i<=K;++i) scanf("%d%d%d",&shu[i].p.x,&shu[i].p.y,&shu[i].r);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
can[i][j]=Can_Attack(wy[i],jl[j]);
for(int j=1;j<=m;++j) if(!Must_Be_Attacked(j)) {puts("-1"); return 0;}
T=nn=n+m+2; S=1;
int l=0,r=4000000;
while(r>l)
{
int mid=(l+r>>1);
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}

【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波的更多相关文章

  1. Bzoj1822 [JSOI2010]Frozen Nova 冷冻波

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 1822[JSOI2010]Frozen Nova 冷冻波

    网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止 ...

  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. POJ1637:Sightseeing tour(混合图的欧拉回路)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10581   Accepted: 4466 ...

  2. mysql删除id最小的条目

    DELETE FROM 表1 WHERE Mid in (select Mid from (SELECT Min(Mid) Mid FROM 表1 c1) t1);

  3. Join/remove server into/from windows domain PS script

    Join server into windows domain PS script $username = "ad-domain\admin" $Password = " ...

  4. Nim博弈(nim游戏)

    http://blog.csdn.net/qiankun1993/article/details/6765688 NIM 游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P- ...

  5. IDEA的常用快捷键

    --------------在日常写代码的过程中自行整理出来----------------- *Alt+Enter 导入包 Ctrl+Alt+L 自动格式化代码 *Alt+Enter 自我修复 Sh ...

  6. 谈pkusc2016的几道数学题

    题面搬来的qwq(忘记出处了 水印应该能表示) [题解] 1. 我们看到这题先想到令(x+y+z)^3 展开得到一坨,稍微减减,得到我们要求证 delta = 3xy^2+3xz^2+3yx^2+3y ...

  7. {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队

    D 五色战队 SRM 06 背景&&描述         游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等.         日向彼方:吾令人观其气,气成五彩, ...

  8. [BZOJ1005]Prufer数列+排列组合

    一棵树的Prufer数列 每次在剩下的树中找到标号最小的叶子节点(对于无根树而言即是度数为1的节点),删去. 同时将其父节点(即与其相连的唯一点)加入Prufer数列当中. 一个Prufer数列所对应 ...

  9. NYOJ 170 网络的可靠性 (数学)

    题目链接 描述 A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助商.它将提供先进的网络协作技术,展示其"智能+互联"的生活概念,同时为参观者提供高品质的个人体 ...

  10. bzoj 1067 特判

    这道题的大题思路就是模拟 假设给定的年份是x,y,首先分为4个大的情况,分别是 x的信息已知,y的信息已知 x的信息已知,y的信息未知 x的信息未知,y的情况已知 x的信息未知,y的情况未知 然后对于 ...