1822: [JSOI2010]Frozen Nova 冷冻波

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 585  Solved: 175
[Submit][Status]

Description

WJJ喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是平面上的点。 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵。 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。 现在巫妖的头目想知道,若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?

Input

输入文件第一行包含三个整数N、M、K(N,M,K<=200),分别代表巫妖的数量、小精灵的数量和树木的数量。 接下来N行,每行包含四个整数x, y, r, t,分别代表了每个巫妖的坐标、攻击范围和施法间隔(单位为秒)。 再接下来M行,每行两个整数x, y,分别代表了每个小精灵的坐标。 再接下来K行,每行三个整数x, y, r,分别代表了每个树木的坐标。 输入数据中所有坐标范围绝对值不超过10000,半径和施法间隔不超过20000。

Output

输出一行,为消灭所有小精灵的最短时间(以秒计算)。如果永远无法消灭所有的小精灵,则输出-1。
 
 
分析:
  初看时没什么想法,想到询问的是最短时间,显然满足单调性,于是yy了一下就出来了。
  二分答案,通过最大流判断答案是否可行。
  当然,这题重点在于如何建图。
  我们先预处理出所有的巫妖与小精灵的关系,判断“巫妖看到小精灵的视线没有被树木阻挡”时,可以用海伦公式求三角形的面积来判断,题目要求不能有任何一个点,所以对于两点只与圆相切于一点也算。
  
  1. #include <set>
  2. #include <map>
  3. #include <list>
  4. #include <cmath>
  5. #include <queue>
  6. #include <stack>
  7. #include <string>
  8. #include <vector>
  9. #include <cstdio>
  10. #include <cstring>
  11. #include <iostream>
  12. #include <algorithm>
  13.  
  14. using namespace std;
  15.  
  16. typedef long long ll;
  17. typedef unsigned long long ull;
  18.  
  19. #define debug puts("here")
  20. #define rep(i,n) for(int i=0;i<n;i++)
  21. #define rep1(i,n) for(int i=1;i<=n;i++)
  22. #define REP(i,a,b) for(int i=a;i<=b;i++)
  23. #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
  24. #define pb push_back
  25. #define RD(n) scanf("%d",&n)
  26. #define RD2(x,y) scanf("%d%d",&x,&y)
  27. #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  28. #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
  29. #define All(vec) vec.begin(),vec.end()
  30. #define MP make_pair
  31. #define PII pair<int,int>
  32. #define PQ priority_queue
  33. #define cmax(x,y) x = max(x,y)
  34. #define cmin(x,y) x = min(x,y)
  35. #define Clear(x) memset(x,0,sizeof(x))
  36. /*
  37.  
  38. #pragma comment(linker, "/STACK:1024000000,1024000000")
  39.  
  40. int size = 256 << 20; // 256MB
  41. char *p = (char*)malloc(size) + size;
  42. __asm__("movl %0, %%esp\n" :: "r"(p) );
  43.  
  44. */
  45.  
  46. /******** program ********************/
  47.  
  48. const int MAXN = 505;
  49. const int MAXM = 100005;
  50. const int INF = 1e9;
  51. const double eps = 1e-8;
  52.  
  53. bool use[205][205];
  54. int po[MAXN],tol;
  55. int gap[MAXN],dis[MAXN],arc[MAXN],pre[MAXN],cur[MAXN];
  56. int n,m,kk,vs,vt;
  57.  
  58. struct A{
  59. int x,y,r,t;
  60. inline void rd(){
  61. RD4(x,y,r,t);
  62. }
  63. }a[MAXN];
  64.  
  65. struct B{
  66. int x,y;
  67. inline void rd(){
  68. RD2(x,y);
  69. }
  70. }b[MAXN];
  71.  
  72. struct C{
  73. int x,y,r;
  74. inline void rd(){
  75. RD3(x,y,r);
  76. }
  77. }c[MAXN];
  78.  
  79. struct node{
  80. int y,f,next;
  81. }edge[MAXM];
  82.  
  83. inline void Add(int x,int y,int f){
  84. edge[++tol].y = y;
  85. edge[tol].f = f;
  86. edge[tol].next = po[x];
  87. po[x] = tol;
  88. }
  89. inline void add(int x,int y,int f){
  90. Add(x,y,f);
  91. Add(y,x,0);
  92. }
  93.  
  94. inline int sap(){
  95. memset(dis,0,sizeof(dis));
  96. memset(gap,0,sizeof(gap));
  97. gap[0] = vt;
  98. rep1(i,vt)
  99. arc[i] = po[i];
  100.  
  101. int ans = 0;
  102. int aug = INF;
  103. int x = vs;
  104.  
  105. while(dis[vs]<vt){
  106. bool ok = false;
  107. cur[x] = aug;
  108. for(int i=arc[x];i;i=edge[i].next){
  109. int y = edge[i].y;
  110. if(edge[i].f>0&&dis[y]+1==dis[x]){
  111. ok = true;
  112. pre[y] = arc[x] = i;
  113. aug = min(aug,edge[i].f);
  114. x = y;
  115. if(x==vt){
  116. ans += aug;
  117. while(x!=vs){
  118. edge[pre[x]].f -= aug;
  119. edge[pre[x]^1].f += aug;
  120. x = edge[pre[x]^1].y;
  121. }
  122. aug = INF;
  123. }
  124. break;
  125. }
  126. }
  127. if(ok)
  128. continue;
  129. int MIN = vt-1;
  130. for(int i=po[x];i;i=edge[i].next)
  131. if(edge[i].f>0&&dis[edge[i].y]<MIN){
  132. MIN = dis[edge[i].y];
  133. arc[x] = i;
  134. }
  135. if(--gap[dis[x]]==0)
  136. break;
  137. dis[x] = ++ MIN;
  138. ++ gap[dis[x]];
  139. if(x!=vs){
  140. x = edge[pre[x]^1].y;
  141. aug = cur[x];
  142. }
  143. }
  144. return ans;
  145. }
  146.  
  147. inline int cdis(int x,int y){
  148. return x*x+y*y;
  149. }
  150.  
  151. inline bool check(A pa,B pb,C pc){
  152. double a = sqrt( cdis(pa.x-pb.x,pa.y-pb.y)*1.0 );
  153. double b = sqrt( cdis(pc.x-pb.x,pc.y-pb.y)*1.0 );
  154. double c = sqrt( cdis(pa.x-pc.x,pa.y-pc.y)*1.0 );
  155. double p = (a+b+c)/2;
  156. double s = p*(p-a)*(p-b)*(p-c); // 海伦公式
  157. double tmp = a*pc.r/2;
  158. tmp *= tmp;
  159. if( tmp>=s )
  160. return false;
  161. return true;
  162. }
  163.  
  164. inline void init(){ // 预处理
  165. rep1(i,n){ // x,y,r,t
  166. rep1(j,m){ // x,y
  167. if( cdis(a[i].x-b[j].x,a[i].y-b[j].y)>a[i].r*a[i].r ){
  168. use[i][j] = false;
  169. continue;
  170. }
  171. use[i][j] = true;
  172. rep1(k,kk){ // x,y,r
  173. if(!check(a[i],b[j],c[k])){
  174. use[i][j] = false;
  175. break;
  176. }
  177. }
  178. }
  179. }
  180. }
  181.  
  182. inline bool ok(int mid){ // 判断二分的答案是否可行
  183. vs = MAXN-3;
  184. vt = vs+1;
  185.  
  186. Clear(po);
  187. tol = 1;
  188.  
  189. rep1(i,n)
  190. add(vs,i,mid/a[i].t+1);
  191. rep1(i,n)
  192. rep1(j,m)
  193. if(use[i][j])
  194. add(i,j+n,1);
  195. rep1(j,m)
  196. add(j+n,vt,1);
  197. return sap()>=m;
  198. }
  199.  
  200. int main(){
  201.  
  202. #ifndef ONLINE_JUDGE
  203. freopen("sum.in","r",stdin);
  204. //freopen("sum.out","w",stdout);
  205. #endif
  206.  
  207. while(~RD3(n,m,kk)){
  208. rep1(i,n)
  209. a[i].rd();
  210. rep1(i,m)
  211. b[i].rd();
  212. rep1(i,kk)
  213. c[i].rd();
  214.  
  215. init(); // 预处理
  216.  
  217. int l = 0 , r = INF;
  218. int ans = -1;
  219.  
  220. while(l<=r){
  221. int mid = (l+r)>>1;
  222. if(ok(mid)){
  223. r = mid-1;
  224. ans = mid;
  225. }else
  226. l = mid+1;
  227. }
  228. cout<<ans<<endl;
  229. }
  230.  
  231. return 0;
  232. }

  

 
 
 

1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流的更多相关文章

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

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

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

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

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

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

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

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

  5. Bzoj1822 [JSOI2010]Frozen Nova 冷冻波

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

  6. BZOJ 1822 Frozen Nova 冷冻波(最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1822 题意:WJJ喜欢“魔兽争霸”这个游戏.在 游戏中,巫妖是一种强大的英雄,它的技能F ...

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

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

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

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

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

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

随机推荐

  1. 自行架设DNS的操作步骤及相关说明

    关于什么是DNS及相关的名词及说明,请看 http://www.wdlinux.cn/bbs/viewthread.php?tid=1081&highlight=dns这里,只是说明,在wdd ...

  2. HITAG 2 125kHz RFID IC Read-Write 256 bits

    Features 256 bits EEPROM memory organized in 8 pages of 32 bits each 32 bits unique factory programm ...

  3. IE下实现类似CSS3 text-shadow文字阴影的几种方法

    IE下实现类似CSS3 text-shadow文字阴影的几种方法 一.开始的擦边话 为了测试IE9浏览器,下午晃晃荡荡把系统换成window7的了.果然,正如网上所传言的一样,IE9浏览器确实不支持C ...

  4. C++ for循环效率

    1.考虑二维数组,在C++中,以先行后列的方式存储连续的数组元素.也就是同一行的元素在一起,同一列的元素之间有间隔,且间隔相同.理想情况下,二维数组的元素是随机访问的,可以直接定位,即i*列数+j.因 ...

  5. CodeForces 176A Trading Business 贪心

    Trading Business 题目连接: http://codeforces.com/problemset/problem/176/A Description To get money for a ...

  6. Codeforces Round #188 (Div. 2) C. Perfect Pair 数学

    B. Strings of Power Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/318/p ...

  7. Lua游戏脚本语言入门(一)

    作者: 沐枫 (第二人生成员) 原文地址:http://job.17173.com/content/2009-01-22/20090122143452606,1.shtml 在这篇文章中,我想向大家介 ...

  8. $parse/$eval和$observe/$watch如何区分

    大家在看angular的时候,有时候偶尔会看到$parse,$eval和$observe,$watch这两对语法,随着深入使用angular,就不可避免使用到它.文章从内部运行机制跟实际需求的角度来解 ...

  9. 纯css3实现的动画加载特效

    之前给大家带了很多款进度加载条,今天再给大家分享一款纯css3实现的动画加载特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="wrap& ...

  10. sqlserver 行转列 语文,数学,物理,化学

    数据库查询行转列 1.原数据库值 stdname stdsubject result 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 李四 化学 李四 化学 2.要得到如下表 ...