题意:平面上有n个A发射点和m个B发射点,可以选择安置相应A/B装置,装置范围是圆,自取半径(要求都相同且<=Rmax)。异种要求范围不相交。求装置范围之和(不是并!)。

标程:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. const int inf=0x3f3f3f3f;
  5. typedef long long ll;
  6. int cnt=,n,m,ans,Rx,xa[N],xb[N],yb[N],ya[N],head[N],Head[N],tot,S,T,dis[N];
  7. ll Ans;
  8. queue<int> q;
  9. bitset<N> f[N];
  10. struct node{int to,next,f;}num[N*N];
  11. struct Node{int d,x,y;Node(){} Node(int A,int B,int C){d=A;x=B;y=C;}}p[N*N];
  12. void add(int x,int y,int w)
  13. {
  14. num[++cnt].to=y;num[cnt].next=head[x];num[cnt].f=w;head[x]=cnt;
  15. num[++cnt].to=x;num[cnt].next=head[y];num[cnt].f=;head[y]=cnt;
  16. if (!f[x][y])
  17. for (int i=;i<=T;i++) if (f[i][x]&&!f[i][y]) f[i]|=f[y];
  18. }
  19. void init()
  20. {
  21. for (int i=;i<=T;i++) f[i].reset(),f[i][i]=;
  22. for (int i=;i<=T;i++)
  23. for (int j=head[i];j;j=num[j].next)
  24. if (num[j].f) f[i][num[j].to]=;
  25. for (int i=;i<=T;i++)
  26. for (int j=;j<=T;j++) if (f[i][j]) f[i]|=f[j];
  27. }
  28. int bfs()
  29. {
  30. memset(dis,,sizeof(dis));dis[S]=;q.push(S);
  31. while (!q.empty())
  32. {
  33. int now=q.front();q.pop();
  34. for (int i=head[now];i;i=num[i].next)
  35. if (num[i].f&&!dis[num[i].to]) dis[num[i].to]=dis[now]+,q.push(num[i].to);
  36. }
  37. return dis[T];
  38. }
  39. int dfs(int x,int Min)
  40. {
  41. int tmp=Min;
  42. if (x==T||!Min) return Min;
  43. for (int &i=Head[x];i&&tmp;i=num[i].next)
  44. if (dis[num[i].to]==dis[x]+)
  45. {
  46. int t=dfs(num[i].to,min(tmp,num[i].f));
  47. num[i].f-=t;num[i^].f+=t;tmp-=t;
  48. }
  49. return Min-tmp;
  50. }
  51. int dinic()
  52. {
  53. if (!f[S][T]) return ;
  54. int res=,tmp;
  55. while (bfs())
  56. {
  57. memcpy(Head,head,sizeof(head));
  58. while (tmp=dfs(S,inf)) res+=tmp;
  59. }
  60. init();
  61. return res;
  62. }
  63. int get_dis(int i,int j){return (xa[i]-xb[j])*(xa[i]-xb[j])+(ya[i]-yb[j])*(ya[i]-yb[j]);}
  64. bool cmp(const Node &A,const Node &B){return A.d<B.d;}
  65. int main()
  66. {
  67. scanf("%d%d%d",&n,&m,&Rx);S=n+m+;T=S+;
  68. for (int i=;i<=T;i++) f[i][i]=;
  69. for (int i=;i<=n;i++) add(S,i,);
  70. for (int i=;i<=m;i++) add(i+n,T,);
  71. for (int i=;i<=n;i++) scanf("%d",&xa[i]);
  72. for (int i=;i<=n;i++) scanf("%d",&ya[i]);
  73. for (int i=;i<=m;i++) scanf("%d",&xb[i]);
  74. for (int i=;i<=m;i++) scanf("%d",&yb[i]);
  75. for (int i=;i<=n;i++)
  76. for (int j=;j<=m;j++) p[++tot]=Node(get_dis(i,j),i,j);
  77. p[++tot]=Node(Rx*Rx*,,);
  78. sort(p+,p+tot+,cmp);
  79. for (int i=;i<=tot&&p[i].d<=Rx*Rx*;i++)//从0开始,有可能
  80. {
  81. add(p[i].x,p[i].y+n,);
  82. if (p[i].d!=p[i+].d) ans+=dinic(),Ans=max(Ans,min((ll)max(p[i+].d,p[i].d),Rx*Rx*4ll)*(n+m-ans));//注意取后一个半径进行运算,注意边界!
  83. }
  84. printf("%.4lf\n",(double)Ans*M_PI*0.25);
  85. return ;
  86. }

易错点:1.注意统计圆半径是已连边半径的后一个。因此需要从没有圆冲突的半径开始算。

2.一开始以为是圆半径不相同。题目又又又看错了啊。可能是太久没写题了。

题解:枚举半径+网络流匹配+传递闭包优化

如果某A和某B之间的距离为dis,那么如果取半径>dis/2,该A和该B之间只能取其一。

枚举关键半径n^2。只能取其一,即求最大独立集。我们想到了可以二分图匹配n^3(而边权为1用dinic可以做到n^2.5)。O(n^4.5)。

结束。

用传递闭包在每次网络流结束后统计S到T的可达情况。下一次进去的时候若S->T不可达,那么return 0。这样最多进行n次网络流,bitset优化一下:O(n*(n^3/w+n^2.5))。

soj115 御坂网络的更多相关文章

  1. Wannafly挑战赛29-A御坂美琴 (dfs+map)

    链接:https://ac.nowcoder.com/acm/contest/271/A来源:牛客网 御坂美琴 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言 ...

  2. Wannafly挑战赛29A御坂美琴

    传送门 这套题很有意思2333 蠢了--首先先判总共加起来等不等于\(n\),不是的话就不行 然后dfs记录\(n\)不断分下去能分成哪些数,用map记录一下,判断是否所有数都能被分出来就是了 //m ...

  3. Wannafly挑战赛26题解

    为啥混进了几道不是魔禁的题--出题人太不敬业了-- 传送门 \(A\) 御坂网络 为啥没有番外个体和整体意志呢 暴力模拟就好了,这个要是都打错我干脆滚回去学文化课算了 //minamoto #incl ...

  4. 如何优雅的进入IT世界

    原始地址:http://www.cocoachina.com/gamedev/misc/2014/0613/8808.html 以下三段是废话,请跳过.   (废话段1)有文科生想了解IT世界.这并不 ...

  5. 什么是A站、B站、C站、D站、E站、F站、G站、HIJKLM站N站?

    A站AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站.A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量 ...

  6. 魔法禁书目录2:回家(codevs 3024)

    题目描述 Description 大妈打完三战回家,我知道他是怎么回来的,欧洲到日本有L个站点他决定乘坐恰好n次飞机(不是学院都市的超音速飞机)和m次火车来从第一个站点到达最后一个站点.但是有一点很重 ...

  7. 洛谷P2264 情书

    P2264 情书 88通过 971提交 题目提供者lin_toto 标签字符串 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 yyy快把题目改回来 噫 这题的题目好逗啊... 情书std ...

  8. [bilibili]弹幕屏蔽列表

    <filters> <item enabled="true">t=定单身</item> <item enabled="true& ...

  9. CCPC-Wannafly Winter Camp Day8 (Div2, onsite)

    咕咕咕.    camp补题. 传送门:https://www.zhixincode.com/contest/29/problems A.Aqours 题意:有一棵有根树,根节点为1,给出每个结点的父 ...

随机推荐

  1. 冲上云霄,Dubbo Go!

    来源:开源中国社区 5 月 21 日,经过一年多的孵化,Apache Dubbo 从 Apache 软件基金会毕业,成为 Apache 顶级项目.推荐:厉害了,Dubbo 正式毕业! Dubbo 是阿 ...

  2. <Linux>Linux基础学习(兄弟连版本)

    1.Linux系统简介 1.1 Unix与Linux发展史 父子关系:Unix 是Linux的前身 1969年,肯丶汤姆森开发Unix系统(为了加快玩游戏的速度 - -,自己开发的系统) 1971年, ...

  3. PWM,SBUS,PPM信号转模拟电压的方案

    PWM,SBUS,PPM信号转模拟电压的方案 -----------------本文由"麦粒电子"撰写,并提供相应产品服务.---------------- 案例场景 有个内部采用 ...

  4. day05 mysql pymysql的使用 (前端+flask+pymysql的使用) 索引 解释执行 慢日志 分页性能方案

    day05 mysql pymysql   一.pymysql的操作     commit(): 在数据库里增删改的时候,必须要进行提交,否则插入的数据不生效       1.增, 删, 改  #co ...

  5. 2.Struts2配置文件

    1.配置文件的加载顺序 0. 需要掌握         * 加载了哪些个配置文件(重点的)         * 配置文件的名称是什么         * 配置文件的位置         * 配置文件的 ...

  6. d3创建多个svg元素

    当然也可以创建dom var svg = d3.select('#svg'); svg .slectAll('circle.bb')     //选中DOM中的所有circle.bb标签,当DOM中不 ...

  7. CSIC_716_20191127【组合,封装、类的私有属性方法、property装饰器】

    组合 what?   组合是指一个对象中,包含另一个或多个对象. why?      减少代码的冗余. How?     在类中加入其他类的对象,实现跨类对象之间的联动. 耦合度  软件设计要 高内聚 ...

  8. leetcode-159周赛-5230-缀点成线

    自己的提交: class Solution: def checkStraightLine(self, coordinates: List[List[int]]) -> bool: if not ...

  9. alert样式优化

    //alert样式优化 function alert(msg, mode) { //mode为空,即只有一个确认按钮,mode为1时有确认和取消两个按钮 msg = msg || ''; mode = ...

  10. NOIp2018集训test-9-4

    老张让我们2.5h考NOI%你题,喵喵喵? 因为今(我)天(实)的(在)题(太)鬼(弱)畜(了)了,我还只改了t1. Problem A. reorder 考试的时候大家都写了最长不降子序列,然后全员 ...