【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波

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。

Sample Input

2 3 1
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 10

Sample Output

5

题解:先判断哪些巫妖能杀死哪些小精灵,然后做法就跟dance那道题一样,直接二分答案,然后跑网络流判定就好了

具体建边方法:设二分答案mid,巫妖攻击间隔t[i]

1.S->巫妖i 容量mid/t[i]+1
2.巫妖i->小精灵j 容量1
3.小精灵j->T 容量1

然后就是怎么判断巫妖i能不能打到小精灵j的问题了

你可能需要这个东西

点到线段的距离点到直线的距离公式

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <queue>
  5. #define n2(_) ((_)*(_))
  6. using namespace std;
  7. typedef long long ll;
  8. int n,m,k,cnt,S,T,ans,tot;
  9. int to[500010],next[500010],val[500010],head[500],d[500],map[210][210],pf[210],pt[210];
  10. ll px[210],py[210],qx[210],qy[210],tx[210],ty[210],tr[210];
  11. queue<int> q;
  12. int dfs(int x,int mf)
  13. {
  14. if(x==T) return mf;
  15. int i,k,temp=mf;
  16. for(i=head[x];i!=-1;i=next[i])
  17. {
  18. if(d[to[i]]==d[x]+1&&val[i])
  19. {
  20. k=dfs(to[i],min(temp,val[i]));
  21. if(!k) d[to[i]]=0;
  22. val[i]-=k,val[i^1]+=k,temp-=k;
  23. if(!temp) break;
  24. }
  25. }
  26. return mf-temp;
  27. }
  28. int bfs()
  29. {
  30. memset(d,0,sizeof(d));
  31. while(!q.empty()) q.pop();
  32. int i,u;
  33. q.push(S),d[S]=1;
  34. while(!q.empty())
  35. {
  36. u=q.front(),q.pop();
  37. for(i=head[u];i!=-1;i=next[i])
  38. {
  39. if(val[i]&&!d[to[i]])
  40. {
  41. d[to[i]]=d[u]+1;
  42. if(to[i]==T) return 1;
  43. q.push(to[i]);
  44. }
  45. }
  46. }
  47. return 0;
  48. }
  49. void add(int a,int b,int c)
  50. {
  51. to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
  52. to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
  53. }
  54. int solve(int sta)
  55. {
  56. int i,j,l;
  57. cnt=0,ans=0,tot=0;
  58. memset(head,-1,sizeof(head));
  59. S=0,T=n+m+1;
  60. for(i=1;i<=n;i++) add(S,i,sta/pt[i]+1),tot+=sta/pt[i]+1;
  61. if(tot<m) return 0;
  62. for(i=1;i<=m;i++) add(i+n,T,1);
  63. for(i=1;i<=n;i++)
  64. for(j=1;j<=m;j++)
  65. if(map[i][j])
  66. add(i,j+n,1);
  67. while(bfs()) ans+=dfs(S,1<<30);
  68. return ans==m;
  69. }
  70. int main()
  71. {
  72. scanf("%d%d%d",&n,&m,&k);
  73. int i,j,l,r=0,mid;
  74. for(i=1;i<=n;i++) scanf("%lld%lld%lld%lld",&px[i],&py[i],&pf[i],&pt[i]),r=max(r,pt[i]);
  75. for(i=1;i<=m;i++) scanf("%lld%lld",&qx[i],&qy[i]);
  76. for(i=1;i<=k;i++) scanf("%lld%lld%lld",&tx[i],&ty[i],&tr[i]);
  77. for(i=1;i<=n;i++)
  78. {
  79. for(j=1;j<=m;j++)
  80. {
  81. if(n2(qx[j]-px[i])+n2(qy[j]-py[i])>n2(pf[i])) continue;
  82. for(l=1;l<=k;l++)
  83. {
  84. ll a=(tx[l]-px[i])*(qx[j]-px[i])+(ty[l]-py[i])*(qy[j]-py[i]),b,c=tr[l]*tr[l];
  85. if(a<=0) b=n2(tx[l]-px[i])+n2(ty[l]-py[i]);
  86. else if(a>=n2(qx[j]-px[i])+n2(qy[j]-py[i]))
  87. b=n2(tx[l]-qx[j])+n2(ty[l]-qy[j]);
  88. else b=n2((qy[j]-py[i])*tx[l]+(px[i]-qx[j])*ty[l]+qx[j]*py[i]-px[i]*qy[j]),
  89. c*=n2(qy[j]-py[i])+n2(px[i]-qx[j]);
  90. if(b<c) break;
  91. }
  92. if(l==k+1) map[i][j]=1;
  93. }
  94. }
  95. l=0,r=4000001,mid;
  96. while(l<r)
  97. {
  98. mid=l+r>>1;
  99. if(solve(mid)) r=mid;
  100. else l=mid+1;
  101. }
  102. if(r==4000001) printf("-1");
  103. else printf("%d",r);
  104. return 0;
  105. }

【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流的更多相关文章

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

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

  2. Bzoj1822 [JSOI2010]Frozen Nova 冷冻波

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

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

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

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

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

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

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

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

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

  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. AFN访问https设置

    AFN访问https的时候需要设定如下两个属性: manager.securityPolicy.allowInvalidCertificates = YES; manager.securityPoli ...

  2. Android Unique Device ID

    There are several occasions when the unique identifier of a device is required. For instance you nee ...

  3. 从1KW条数据中筛选出1W条最大的数

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  4. Ooui:在浏览器中运行.NET应用 Ooui.Wasm:浏览器中的.NET

    在过去数年中,桌面应用开发人员一直处境艰难,因为人们的主要关注点聚焦于Web和移动应用.由于Microsoft未来Windows平台的计划未定,并且UWP应用也没有突破性进展,因此技术落伍的责任也不应 ...

  5. 转在Python中实现PageFactory模式

    转自: http://www.cnblogs.com/fnng/p/5092383.html 关于 PageFactory 的概念主要是Java中内置了PageFactory类. import org ...

  6. Android中的倒计时实现

    一.android.os包下提供了倒计时的抽象工具类: public abstract class CountDownTimer { /** * Millis since epoch when ala ...

  7. Android studio 使用心得(四)—android studio 多渠道打包(二)

    Android studio 使用心得(四)—android studio 多渠道打包 这篇文章讲了一种打包方式.是直接在android studio 里面可视化操作,结合配置文件.我个人觉得严格上来 ...

  8. Scrapy使用问题整理(转载)

    转载自:http://blog.csdn.net/heu07111121/article/details/50832999   最近尝试使用Scrapy进行数据抓取,并尝试在windows7 64位系 ...

  9. LINQ - 在Where條件式中使用in與not in(转载)

    算算時間,接觸LINQ也有一個月的時間了,可以算是落伍兼新生,不過最近在寫專案的時候,遇到了在LINQ的Where條件式中要如何使用in與 not in呢!? 這時候真的只能坐在位子上仰天長笑,開始懷 ...

  10. 在intellij中使用checkStyle进行代码规范

    1 编写代码检测规则可以参考阿里和google的规则和checkstyle的官网文档.checkstyle官网地址http://checkstyle.sourceforge.net/ 假设自己的sty ...