分配问题,将小精灵分配给巫妖,巫妖可接收量取决于时间长短,适应性取决于地形

预处理巫妖小精灵对的可行性,就是询问线段 \(AB\) 与圆 \(O\) 是否有交点

过点 \(O\) 作直线 \(AB\) 的垂线,考虑垂足,若垂足不在线段 \(AB\) 上,则问题等价于线段是否存在一段点在圆内

否则通过 \(\overrightarrow{AO} \ast \overrightarrow{AB}\) 计算 \(\overrightarrow{AO}\), \(\overrightarrow{AB}\) 所夹平行四边形面积,进而求得 \(O\) 到直线 \(AB\) 的距离,与半径比较大小即可

列出式子整理一下就可以避免double了!还有不要忘了巫妖有攻击半径

二分时间,用网络流判断可行性,即

由源点向巫妖连施法次数的边,巫妖向小精灵连边,小精灵连向汇点

二分上界为 \(MaxT\ast M\) ,下界为 \(0\) ,最大流等于小精灵数即为可行

#include <cstdio>
#include <algorithm>using std::min;
using std::max;const int MAXN=211;
const int MAXM=211;
const int MAXK=211;
const int MAXV=MAXN+MAXM;
const int MAXE=MAXN*MAXM+MAXN+MAXM;
const int INF=1034567890;int N, M, K;
bool Win=true;struct Pos{int x, y;Pos(){}Pos(int _x, int _y){x=_x;y=_y;}void read(){scanf("%d%d", &x, &y);}
};Pos operator - (Pos A, Pos B){return Pos(A.x-B.x, A.y-B.y);
}int Len(Pos A){return A.x*A.x+A.y*A.y;
}int Dis(Pos A, Pos B){return Len(A-B);
}int corss(Pos A, Pos B){return A.x*B.y-A.y*B.x;
}int dot(Pos A, Pos B){return A.x*B.x+A.y*B.y;
}struct Elf{Pos P;bool OutofTree;bool Link;
} El[MAXM];struct Lich{Pos P;int R, T;bool OutofTree;
} L[MAXN];struct Tree{Pos P;int R;
} T[MAXK];bool Map[MAXN][MAXM];struct Vert{int FE;int Bfn, Lev;
} V[MAXV];int Vcnt;
int Lp[MAXN], Ep[MAXM];
int Sour, Sink;struct Edge{int x, y, f, next, neg;
} E[MAXE<<1];int Ecnt;void addE(int a, int b, int c=1){++Ecnt;E[Ecnt].x=a;E[Ecnt].y=b;E[Ecnt].f=c;E[Ecnt].next=V[a].FE;V[a].FE=Ecnt;E[Ecnt].neg=Ecnt+1;++Ecnt;E[Ecnt].y=a;E[Ecnt].x=b;E[Ecnt].f=0;E[Ecnt].next=V[b].FE;V[b].FE=Ecnt;E[Ecnt].neg=Ecnt-1;
}int Q[MAXV], Head, Tail;
int BFN;bool BFS(int at=Sour){Head=Tail=1;++BFN;V[at].Lev=1;Q[Tail++]=at;V[at].Bfn=BFN;while(Head<Tail){at=Q[Head++];for(int k=V[at].FE, to;k>0;k=E[k].next){if(E[k].f<=0)   continue;to=E[k].y;if(V[to].Bfn==BFN)  continue;V[to].Lev=V[at].Lev+1;Q[Tail++]=to;V[to].Bfn=BFN;}}return V[Sink].Bfn==BFN;
}int DFS(int at=Sour, int inc=INF){if(at==Sink || inc<=0)  return inc;int ret=0, out;for(int k=V[at].FE, to;k>0;k=E[k].next){if(E[k].f<=0)   continue;to=E[k].y;if(V[to].Lev!=V[at].Lev+1)  continue;out=DFS(to, min(E[k].f, inc));ret+=out;inc-=out;E[k].f-=out;E[E[k].neg].f+=out;}if(inc>0)   V[at].Lev=-1;return ret;
}int DINIC(){int ret=0;while(BFS()){ret+=DFS();}return ret;
}int Left, Right, Mid;
int MaxT;int Cnt(Lich &l, int &t){if(l.T==0)  return INF;return t/(l.T)+1;
}bool Test(int Time){for(int i=1;i<=Vcnt;++i)    V[i].FE=0;Ecnt=0;for(int i=1;i<=N;++i)   addE(Sour, Lp[i], Cnt(L[i], Time));for(int i=1;i<=M;++i)   addE(Ep[i], Sink);for(int i=1;i<=N;++i)for(int j=1;j<=M;++j)if(Map[i][j])addE(Lp[i], Ep[/*i*/j]);return DINIC()==M;
}int main(){scanf("%d%d%d", &N, &M, &K);for(int i=1;i<=N;++i){L[i].P.read();scanf("%d%d", &L[i].R, &L[i].T);}for(int i=1;i<=M;++i)El[i].P.read();for(int i=1;i<=K;++i){T[i].P.read();scanf("%d", &T[i].R);}for(int i=1;i<=N;++i){L[i].OutofTree=true;for(int j=1;j<=K;++j)if(Dis(L[i].P, T[j].P)<=T[j].R*T[j].R)L[i].OutofTree=false;}for(int i=1;i<=M;++i){El[i].OutofTree=true;for(int j=1;j<=K;++j){if(Dis(El[i].P, T[j].P)<=T[j].R*T[j].R)El[i].OutofTree=false;}}for(int i=1;i<=M;++i)if(!El[i].OutofTree){Win=false;break;}if(!Win){puts("-1");return 0;}for(int i=1;i<=N;++i){if(!L[i].OutofTree) continue;for(int j=1, c;j<=M;++j){if(!El[j].OutofTree)    continue;if(Dis(El[j].P, L[i].P)>L[i].R*L[i].R)  continue;c=1;for(int k=1, Dot, Corss;k<=K && c>0;++k){Dot=dot(El[j].P-L[i].P, T[k].P-L[i].P);if(Dot>0 && Dot<Dis(L[i].P, El[j].P)){Corss=corss(El[j].P-L[i].P, T[k].P-L[i].P);if(1LL*Corss*Corss<=1LL*Dis(L[i].P, El[j].P)*T[k].R*T[k].R)c=0;}}if(c>0){//addE(Lp[i], Ep[j]);//printf("%d %d\n", i, j);Map[i][j]=true;El[j].Link=true;}}}for(int i=1;i<=M;++i)if(!El[i].Link){Win=false;break;}if(!Win){puts("-1");return 0;}for(int i=1;i<=N;++i)   Lp[i]=++Vcnt;for(int i=1;i<=M;++i)   Ep[i]=++Vcnt;Sour=++Vcnt;Sink=++Vcnt;for(int i=1;i<=N;++i)   MaxT=max(MaxT, L[i].T);Left=0;Right=MaxT*M;while(Left<Right){Mid=(Left+Right)>>1;if(Test(Mid))   Right=Mid;else    Left=Mid+1;}Mid=(Left+Right)>>1;printf("%d\n", Mid);return 0;
}/*
2 3 1
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 105*/

转载于:https://www.cnblogs.com/Pickupwin/p/BZOJ1822.html

BZOJ 1822 Frozen Nova 霜冻新星相关推荐

  1. bzoj 1822: [JSOI2010]Frozen Nova 冰霜新星

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

  2. BZOJ 1822 浅谈计算几何在网络流建模中的实际运用

    世界真的很大 网络流是个神奇东西,可以用来解决很多意想不到的问题 但是做题久了,有套路了,大多数网络流也就不是那么难 只要建好模型,跑模板就OK 然后就会出现某些丧心病狂的出题人想到干脆卡一下建边之类 ...

  3. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  4. 小酌重构系列[18]——重命名

    概述 代码是从命名开始的,我们给类.方法.变量和参数命名,我们也给解决方案.工程.目录命名.在编码时,除了应该遵守编程语言本身的命名规范外,我们应该提供好的命名.好的命名意味着良好的可读性,读你代码的 ...

  5. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  6. [网摘学习]在Ubuntu上安装和配置OpenStack Nova之二

    再收藏一份Openstack的文章,这两天的操作与此相同.但其中出现的问题还需要查找原因.待个人继续学习研究. 原文参考:http://www.linuxde.net/2011/11/1599.htm ...

  7. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  8. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  9. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

最新文章

  1. 我的2015学习总结及2016的技术规划(2016.02)
  2. 基于EasyNVR二次开发实现业务需求:用户、权限、设备管理
  3. openssl 加密解密 指令_Shell openssl命令加密解密字符串
  4. java 建立ssh隧道_如何使用IntelliJ和JDBC SSH隧道并连接到数据库?
  5. LoadRunner接口工作总结
  6. 没错 企业想提升安全防护需要HR的合作
  7. Atitit 软件与开发的未来趋势 attilax总结 1.1. Sdx软件重构世界 软件定义未来 1 1.2. 《软件和信息技术服务业发展规划(2016-2020年)》( 2 1.3. Iot物联
  8. python颜色大全
  9. 电脑中的B、K、M、G单位换算你能分清吗?
  10. 记一次解决eclipse复制粘贴不能用问题
  11. 用java编程实现java代码的次行代码风格转化为尾行代码风格
  12. 【全网首发】电脑搜索不到部分WiFi怎么办?亲测有效!
  13. vscode遇到无法访问此网站问题的两种解决方法
  14. device-mapper: multipath: Failing path recovery
  15. 基于Arduino控制步进电机 编码器普菲特TB6600控制
  16. 【Jmeter】分布式测试--单机均衡负载压测
  17. PHP快速入门(一)
  18. HX=JE,HX-JE芯片,无感4.9V升压ic电路图PDF应用技术
  19. jQuery复习-(jQuery入门,jQuery语法(DOM),jQuery动画)
  20. 2012年下半年软件评测师上午试题

热门文章

  1. python-使用字典使Fibonacci更有效率
  2. MySQL 批量添加
  3. mbed OS - ARM关于物联网(IoT)的战略布局
  4. hibernate的数据关联映射
  5. [Android]Handler的消息机制
  6. VC++2012编程演练数据结构《31》狄杰斯特拉算法
  7. RN性能优化以及事件监听
  8. 零基础带你学习MySQL—foreign key 外键(二十六)
  9. 35岁的程序员如果不转行,从事哪些细分行业比较好?
  10. 短期逾期影响贷款吗?