题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=3232

题解:

首先我们看到这道题让我们最优化一个分式.

所以我们应该自然而然地想到01分数规划

首先我们考虑如何恰当地计算所有在封闭多边形内部的权值

我们可以首先假定DZY一定沿着逆时针走,然后我们发现:

我们可以对所有向右,向上的边的\(a\)值都设为在这条边的左侧的同行的价值和.

\(b\)值即为经过这条边的花费

剩下的两条边对应着这两条边将价值取反即可.

我们发现把路线上所有边的\(a\)加起来除二即为围住的元素的val和

所以我们就可以直接01分数规划了.

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. inline void read(int &x){
  7. x=0;char ch;bool flag = false;
  8. while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
  9. while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
  10. }
  11. const int maxn = 110;
  12. const double eps = 1e-5;
  13. struct Edge{
  14. int to,next;
  15. double dis,a,b;
  16. }G[maxn*maxn<<3];
  17. int head[maxn*maxn<<2],cnt;
  18. void add(int u,int v,double a,double b){
  19. G[++cnt].to = v;
  20. G[cnt].next = head[u];
  21. head[u] = cnt;
  22. G[cnt].a = a;
  23. G[cnt].b = b;
  24. }
  25. bool inq[maxn*maxn<<2];double dis[maxn*maxn<<2];
  26. #define v G[i].to
  27. bool dfs(int u){
  28. inq[u] = true;
  29. for(int i = head[u];i;i=G[i].next){
  30. if(dis[v] > dis[u] + G[i].dis){
  31. dis[v] = dis[u] + G[i].dis;
  32. if(inq[v]) return true;
  33. if(dfs(v)) return true;
  34. }
  35. }inq[u] = false;
  36. return false;
  37. }
  38. #undef v
  39. int nodecnt;
  40. int id[maxn][maxn];
  41. inline bool check(double mid){
  42. memset(inq,0,sizeof inq);memset(dis,0,sizeof dis);
  43. for(int i=1;i<=cnt;++i) G[i].dis = -(G[i].a - mid*G[i].b);
  44. for(int i=1;i<=nodecnt;++i) if(dfs(i)) return true;
  45. return false;
  46. }
  47. int sl[maxn][maxn],sr[maxn][maxn];
  48. int main(){
  49. int n,m;read(n);read(m);
  50. for(int i=1,x;i<=n;++i){
  51. for(int j=1;j<=m;++j){
  52. read(x);
  53. sl[i][j] = sl[i][j-1] + x;
  54. sr[i][j] = sr[i-1][j] + x;
  55. }
  56. }
  57. for(int i=0;i<=n;++i){
  58. for(int j=0;j<=m;++j){
  59. id[i][j] = ++nodecnt;
  60. }
  61. }
  62. for(int i=0,x;i<=n;++i){
  63. for(int j=1;j<=m;++j){
  64. read(x);
  65. add(id[i][j-1],id[i][j],sr[i][j],x);
  66. add(id[i][j],id[i][j-1],-sr[i][j],x);
  67. }
  68. }
  69. for(int i=1,x;i<=n;++i){
  70. for(int j=0;j<=m;++j){
  71. read(x);
  72. add(id[i-1][j],id[i][j],-sl[i][j],x);
  73. add(id[i][j],id[i-1][j],sl[i][j],x);
  74. }
  75. }
  76. double l = .0,r = 1e9;
  77. while(r-l > eps){
  78. double mid = (l+r)/2.0;
  79. if(check(mid)) l = mid;
  80. else r = mid;
  81. }printf("%.3lf\n",(l/2.0));
  82. getchar();getchar();
  83. return 0;
  84. }

bzoj 3232: 圈地游戏 01分数规划的更多相关文章

  1. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  2. bzoj 3232: 圈地游戏【分数规划+最小割】

    数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...

  3. bzoj 3232: 圈地游戏

    bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...

  4. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

  5. BZOJ 3232: 圈地游戏 分数规划+判负环

    3232: 圈地游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 966  Solved: 466[Submit][Status][Discuss] ...

  6. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  7. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  8. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  9. BZOJ 4753 [Jsoi2016]最佳团体 ——01分数规划 树形DP

    要求比值最大,当然用分数规划. 二分答案,转化为选取一个最大的联通块使得它们的和大于0 然后我们直接DP. 复杂度$O(n^2\log {n})$ #include <map> #incl ...

随机推荐

  1. ProjectManager Beta 7 项目管理器发布

    上次在Alpha阶段有一个可用版本Alpha 8也在这个博客发布了,传送:http://www.cnblogs.com/deali/p/ProjectManager.html ProjectManag ...

  2. PDP开发环境搭建

    1. 安装git 2.创建SSH-rsa钥匙 3. 写入 gitlab 4. 克隆分支 git clone  -b  dev_pdp_minz_ep_metting   git@gitlab.csvw ...

  3. SQLServer判断一个IP是否在一个IP段里

    declare @ip1 varchar(20)declare @ip2 varchar(20)set @ip1='221.231.138.101'set @ip2='255.255.255.255' ...

  4. ABAP xml

    [转]Part 1 - Expressiveness of Simple TransformationsSimple Transformations are a SAP proprietary pro ...

  5. Kattis - entertainmentbox 【贪心】

    思路 先将 N 个 电视节目 排序 根据 结束时间 ,结束的早的 排在前面 然后 弄 K个标记 记录 结束时间 然后 遍历一下 每次 如果能插入的话 插入到 结束时间最小的那个 队列里面去然后 每次插 ...

  6. [转] 携程App网络服务通道治理和性能优化@2016

    App网络服务的高可靠和低延迟对于无线业务稳定发展至关重要,过去两年来我们一直在持续优化App网络服务的性能,到今年Q2结束时基本完成了App网络服务通道治理和性能优化的阶段性目标,特此撰文总结其中的 ...

  7. iOS base64编码 MD5 加密

    //创建一个Base64编码的NSString对象 //字符串 转二进制 NSData *nsdata = [@"iOS Developer Tips encoded in Base64&q ...

  8. 第三篇、dom操作续

    一.属性操作 属性操作 attributes // 获取所有标签属性 setAttribute(key,value) // 设置标签属性 getAttribute(key) // 获取指定标签属性 r ...

  9. 第一天 格式化操作符 条件、for、while、break、continue语句

    python2和3的区别: 2中的print 不必加括号 3中的print变为函数 要加括号   2中的input不能输入字母(输入的字母被认为是变量,而之前又没定义,所以报错),默认只能计算数字,要 ...

  10. hbase shell概述

    hbase shell-general(常规指令):http://www.cnblogs.com/husky/p/6374867.html hbase shell-ddl(表定义指令):http:// ...