4950: [Wf2017]Mission Improbable

Time Limit: 1 Sec  Memory Limit: 512 MB
Submit: 608  Solved: 222
[Submit][Status][Discuss]

Description

那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙。Patrick在编程竞赛
上豪赌输掉了一大笔钱,所以他需要再干一票。为此他需要你的帮助,虽然你已经金盆洗手了。你刚开始很不情愿,
因为你一点也不想再回到那条老路上了,但是你觉得听一下他的计划也无伤大雅。在附近的一个仓库里有一批货物,
包含一些贵重的消费性部件,Patrick企图从中尽可能多地偷些东西出来。这意味着要找一条进去的路,弄晕安保人
员,穿过各种各样的激光射线,你懂的,都是常见的抢劫技术。然而,仓库的核心装备了一套Patrick搞不定的安保系
统。这也是他需要你帮助他的地方。这批货物被放置在一些巨大的立方体箱里,每个箱子的尺寸都是相同的。这些
箱子堆放成许多整齐的堆,每个箱子可以表示成一个三维的网格。安保系统每个小时会用三台相机对这堆货物进行
一次拍照,相机分别为:前置相机(front camera),侧置相机(side camera)和顶置相机(top camera)。前置相机的照
片显示了每一行最高的那堆箱子的高度,侧置相机显示了每一列最高的那堆箱子的高度,顶置相机显示了每个位置是
否存在一堆箱子。如果安保系统发现任何一张照片出现了变化,它会立即拉响警报。一旦 Patrick 进去了,他会确
定每堆箱子的高度并且发给你。图1显示了一种网格可能的放置,以及每台相机会得到的视图。
图 1. 网格的高度值与对应的相机视图。
图 2. 洗劫后网格可能的高度值。
 
Patrick想尽可能多偷走一些箱子。由于他不能弄坏安保系统,他准备重新安排剩余每堆箱子的放置,使得下一次相
机取像时会得到相同的照片,从而骗过安保系统。在上面的例子中,他可以偷走九个箱子。图2显示了一种可能的剩
余箱子的安置方案能使得安保系统认为与原安置情况相同。Patrick想请你帮他确定在保证能骗过安保系统的情况
下他最多能偷走多少个箱子。你会帮他干完这最后一票么?

Input

第一行包含两个整数r(1≤r≤100)和c(1≤n≤100),分别表示网格的行数与列数。
接下来r行,每行包含c个整数,表示对应行上每堆立方体箱的高度(箱子的数量)。
所有的高度在0到10^9之间 (含边界) 。

Output

输出在不被发现的情况下最多能偷走多少箱子。

Sample Input

样例1
5 5
1 4 0 5 2
2 1 2 0 1
0 2 3 4 4
0 3 0 3 1
1 2 2 1 1
样例2
2 3
50 20 3
20 10 3

Sample Output

样例1
9
样例2
30
 
这个题乍一看上去可能不是很容易想出来做法,不过动动脑子也就可以知道,俯视图就是要求当前有箱子的格子至少留一个,然后左视图和正视图就是要求每行每列的最大值不能变化。嗯,可以考虑一下贪心,就是只要不是最大的就通通拿走。事实证明这种贪心是非常可行的,但是也有缺陷,就是可能有那么一行一列的箱子的最大值是相同的,这个时候把最大值放在交点处很明显就要比放在其它的地方要好的多。那么如何限制呢?想到一个叫游戏的题,就是把每一行和每一列都当做点,然后用流量表示限制,嗯,貌似可以出解了。。。然后注意数组什么的要开大,数据很大要LL。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<queue>
  7. #define re register
  8. #define inf 400000000000000ll
  9. #define MAXN 205
  10. #define MAXM 1000001
  11. #define ll long long
  12. using namespace std;
  13. int cur[];
  14. struct po
  15. {
  16. ll nxt,to,w;
  17. }edge[MAXM];
  18. int head[MAXN],dep[MAXN],num=-;
  19. int l[MAXN],h[MAXN],a[][];
  20. int n,m,s,t;
  21. ll ans;
  22. inline int read()
  23. {
  24. int x=,c=;
  25. char ch=' ';
  26. while((ch>''||ch<'')&&ch!='-')ch=getchar();
  27. while(ch=='-')c*=-,ch=getchar();
  28. while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
  29. return x*c;
  30. }
  31. inline void add_edge(int from,int to,int w)
  32. {
  33. edge[++num].nxt=head[from];
  34. edge[num].to=to;
  35. edge[num].w=w;
  36. head[from]=num;
  37. }
  38. inline void add(int from,int to,int w)
  39. {
  40. add_edge(from,to,w);
  41. add_edge(to,from,);
  42. }
  43. inline bool bfs()
  44. {
  45. memset(dep,,sizeof(dep));
  46. queue<int> q;
  47. while(!q.empty())
  48. q.pop();
  49. q.push(s);
  50. dep[s]=;
  51. while(!q.empty())
  52. {
  53. int u=q.front();
  54. q.pop();
  55. for(re int i=head[u];i!=-;i=edge[i].nxt)
  56. {
  57. int v=edge[i].to;
  58. if(dep[v]==&&edge[i].w)
  59. {
  60. dep[v]=dep[u]+;
  61. if(v==t)
  62. return ;
  63. q.push(v);
  64. }
  65. }
  66. }
  67. return ;
  68. }
  69. inline ll dfs(int u,ll dis)
  70. {
  71. if(u==t||!dis)
  72. return dis;
  73. ll diss=;
  74. for(re int& i=cur[u];i!=-;i=edge[i].nxt)
  75. {
  76. int v=edge[i].to;
  77. if(edge[i].w!=&&dep[v]==dep[u]+)
  78. {
  79. ll check=dfs(v,min(dis,edge[i].w));
  80. if(check>)
  81. {
  82. dis-=check;
  83. diss+=check;
  84. edge[i].w-=check;
  85. edge[i^].w+=check;
  86. if(dis==) break;
  87. }
  88. }
  89. }
  90. return diss;
  91. }
  92. inline ll dinic()
  93. {
  94. ll ans=;
  95. while(bfs())
  96. {
  97. for(re int i=s;i<=t;i++)
  98. cur[i]=head[i];
  99. while(ll d=dfs(s,inf))
  100. ans+=d;
  101. }
  102. return ans;
  103. }
  104. int main()
  105. {
  106. //freopen("date.in","r",stdin);
  107. memset(head,-,sizeof(head));
  108. n=read();m=read();
  109. for(re int i=;i<=n;i++)
  110. for(re int j=;j<=m;j++){
  111. a[i][j]=read();
  112. h[i]=max(h[i],a[i][j]);
  113. l[j]=max(l[j],a[i][j]);
  114. if(a[i][j]) ans+=a[i][j]-;
  115. }
  116. s=,t=n+m+;
  117. for(re int i=;i<=n;i++) if(h[i])ans-=h[i]-;
  118. for(re int i=;i<=m;i++) if(l[i])ans-=l[i]-;
  119.  
  120. for(re int i=;i<=n;i++)
  121. for(re int j=;j<=m;j++){
  122. if(h[i]==l[j]&&h[i]&&a[i][j]){
  123. add(i,j+n,h[i]-);
  124. }
  125. }
  126. for(re int i=;i<=n;i++){
  127. if(!h[i]) continue;
  128. add(s,i,h[i]-);
  129. }
  130.  
  131. for(re int i=;i<=m;i++){
  132. if(!l[i]) continue;
  133. add(i+n,t,l[i]-);
  134. }
  135.  
  136. cout<<ans+dinic();
  137. return ;
  138. }

4950: [Wf2017]Mission Improbable的更多相关文章

  1. 【刷题】BZOJ 4950 [Wf2017]Mission Improbable

    Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛上豪赌输掉了一大笔钱,所以他需要再干一票.为此他需要你的帮助 ...

  2. 【bzoj4950】【 [Wf2017]Mission Improbable】贪心+二分图匹配

    (上不了p站我要死了,侵权度娘背锅) Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛 上豪赌输掉了一大笔钱 ...

  3. bzoj4950: [Wf2017]Mission Improbable

    跟着靖靖做题%%%%% 这题一看就觉得和之前的某场模拟赛的一道题很像,找假如某行某列的最大值一样的就可以只堆一个,跑匈牙利就行 一开始以为箱子不能移动-_-! 然后有个坑,大家都知道当这个位置有箱子就 ...

  4. 【WF2017】Mission Improbable

    http://www.lydsy.com/JudgeOnline/problem.php?id=4950 对于俯视图很好解决,把所有不是0的位置拿到剩1就可以了. 对于正视图与侧视图,稍微想一下也能发 ...

  5. #6472. 「ICPC World Finals 2017」难以置信的任务 Mission Improbable

    可以简化一下问题,假设Patrick把箱子都拿走但是原来有箱子的位置留下一个,现在要放箱子使得每行每列最大值都满足,最少放多少个. 设第\(i\)行的最大值是\(H(i)\),第\(i\)列的是\(W ...

  6. bzoj4950(二分图最大匹配)

    [Wf2017]Mission Improbable Time Limit: 1 Sec  Memory Limit: 1024 MBSubmit: 105  Solved: 49[Submit][S ...

  7. World Finals 2017 (水题题解)

    看大佬做2017-WF,我这种菜鸡,只能刷刷水题,勉强维持生活. 赛后补补水题. 题目pdf链接,中文的,tls翻译的,链接在这里 个人喜欢在vjudge上面刷题. E Need for Speed ...

  8. Java 性能分析工具 , 第 3 部分: Java Mission Control

    引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...

  9. 正则表达式30分钟入门:http://deerchao.net/tutorials/regex/regex.htm#mission

    http://deerchao.net/tutorials/regex/regex.htm#mission

随机推荐

  1. JEECMS 2.4.2 之添加新的可扩展的ftl模版文件、自定义方法

    Demo: <@cms.CfgList isPage='1' league='0' recommend='0' lala='0' hot='1' memberId='0' pageNo=page ...

  2. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  3. 《从零开始学Swift》学习笔记(Day 15)——请注意数字类型之间的转换

    原创文章,欢迎转载.转载请注明:关东升的博客 在C.Objective-C和Java等其他语言中,整型之间有两种转换方法: 从小范围数到大范围数转换是自动的: 从大范围数到小范围数需要强制类型转换,有 ...

  4. Java的四种引用,强弱软虚,用到的场景

    众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活).为了解决内存操作不灵活这个问题,可以采用软引用等方法. 在J ...

  5. delphi 创建服务,安装与卸载服务

    运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成个服务框架.将工程保存为ServiceDemo.dpr和Unit ...

  6. 巨蟒python全栈开发django1:自定义框架

    今日大纲: 1.val和text方法的补充 2.信息收集卡用bootstrap实现 3.自定义web框架 4.http协议 5.自定义web框架2 今日内容详解: 1.val和text方法的补充 ht ...

  7. es 中 for in for of

    arr=[11,22,33,44,55,66,77,88]for (const i in arr){ console.log(i) if (i===4){ console.log(arr[i]) }} ...

  8. amortized analysis

    w https://en.wikipedia.org/wiki/Amortized_analysis In computer science, amortized analysis is a meth ...

  9. 修改本机域名localhost为任意你想要的名称

    web项目研发中,测试的时候项目路径与发布以后的路径不一致,项目组之间的路径不一致,这样会加大工作量,这个时候我们可以统一一下开发的路径,这样可以省很多事,话不多说,看下面教程: 在系统盘中的如下路径 ...

  10. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...