题目链接

\(Description\)

\(Solution\)

这种题当然要黑白染色。。

两种颜色的格子数可能相同,也可能差1。记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权值和。

如果\(n1\neq n2\),假设\(n1>n2\),因为每次是同时给两种颜色+1,所以最后的差也只能是\(s1-s2\)(\(s1>s2\)),个数只差1,所以也只能都变成\(s1-s2\)。(注意\(s1-s2\geq A_{max}\))

如果\(n1=n2\),假设\(x\)合法,那么\(x+1\)也合法,因为黑白可以两两配对并加一。

即可以二分答案。

二分图匹配模型,二分后边的容量就可以确定了。最大流是\((x*tot-s1-s2)/2\)或者源点汇点都满流则合法。

那个。。上限是\(A_{max}\)么。。显然不是啊。

忍不住吐槽,这写的有点。。

  1. //1284kb 5160ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. //#define gc() getchar()
  7. #define MAXIN 150000
  8. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  9. typedef long long LL;
  10. const int N=1700,M=N<<3;
  11. const LL INF=1e14;
  12. int n,m,src,des,A[N],Enum,H[N],cur[N],nxt[M],fr[M],to[M],pre[N],lev[N],num[N];
  13. LL cap[M];
  14. char IN[MAXIN],*SS=IN,*TT=IN;
  15. inline int read()
  16. {
  17. int now=0;register char c=gc();
  18. for(;!isdigit(c);c=gc());
  19. for(;isdigit(c);now=now*10+c-'0',c=gc());
  20. return now;
  21. }//我可能有毒
  22. #define AddEdge(u,v,w) to[++Enum]=v,fr[Enum]=u,nxt[Enum]=H[u],H[u]=Enum,cap[Enum]=w,to[++Enum]=u,fr[Enum]=v,nxt[Enum]=H[v],H[v]=Enum,cap[Enum]=0
  23. bool BFS()
  24. {
  25. static int q[N];
  26. for(int i=src; i<des; ++i) lev[i]=des+1;
  27. lev[des]=0, q[0]=des; int h=0,t=1;
  28. while(h<t)
  29. {
  30. int x=q[h++];
  31. for(int i=H[x]; i; i=nxt[i])
  32. if(cap[i^1] && lev[to[i]]==des+1) lev[to[i]]=lev[x]+1, q[t++]=to[i];
  33. }
  34. return lev[src]<=des;
  35. }
  36. inline LL Augment()
  37. {
  38. LL mn=INF;
  39. for(int i=des; i!=src; i=fr[pre[i]])
  40. mn=std::min(mn,cap[pre[i]]);
  41. for(int i=des; i!=src; i=fr[pre[i]])
  42. cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;
  43. return mn;
  44. }
  45. LL ISAP()
  46. {
  47. if(!BFS()) return 0ll;
  48. for(int i=src; i<=des; ++i) ++num[lev[i]],cur[i]=H[i];
  49. int x=src; LL res=0;
  50. while(lev[src]<=des)
  51. {
  52. if(x==des) x=src, res+=Augment();
  53. bool can=0;
  54. for(int i=cur[x]; i; i=nxt[i])
  55. if(lev[to[i]]==lev[x]-1 && cap[i])
  56. {
  57. can=1, cur[x]=i, pre[x=to[i]]=i;
  58. break;
  59. }
  60. if(!can)
  61. {
  62. int mn=des;
  63. for(int i=H[x]; i; i=nxt[i])
  64. if(cap[i]) mn=std::min(mn,lev[to[i]]);
  65. if(!--num[lev[x]]) break;
  66. ++num[lev[x]=mn+1], cur[x]=H[x];
  67. if(x!=src) x=fr[pre[x]];
  68. }
  69. }
  70. return res;
  71. }
  72. bool Check(LL x,LL s1,LL s2)
  73. {
  74. Enum=1, memset(H,0,sizeof H);
  75. int tot=0;
  76. for(int i=1; i<=n; ++i)
  77. for(int j=1; j<=m; ++j)
  78. {
  79. ++tot;
  80. if((i+j)&1)
  81. {
  82. AddEdge(src,tot,x-A[tot]);//, sum+=x-A[tot];
  83. if(i<n) AddEdge(tot,tot+m,INF);//边是有向的,不能容量都为INF啊mdzz
  84. if(j<m) AddEdge(tot,tot+1,INF);
  85. }
  86. else
  87. {
  88. AddEdge(tot,des,x-A[tot]);
  89. if(i<n) AddEdge(tot+m,tot,INF);//white->black!
  90. if(j<m) AddEdge(tot+1,tot,INF);
  91. }
  92. }
  93. return (ISAP()<<1ll)==(x*tot-s1-s2);//ISAP()==sum;
  94. }
  95. int main()
  96. {
  97. for(int T=read(); T--; )
  98. {
  99. n=read(), m=read(), src=0, des=n*m+1;
  100. int tot=0,mx=0; LL s1=0,s2=0;
  101. for(int i=1; i<=n; ++i)
  102. for(int j=1; j<=m; ++j)
  103. mx=std::max(mx,A[++tot]=read()),(i+j)&1?(s2+=A[tot]):(s1+=A[tot]);//s1,s2别反。。
  104. if(tot&1) printf("%lld\n",(/*s1>s2&&*/s1-s2>=mx&&Check(s1-s2,s1,s2))?(((s1-s2)*tot-s1-s2)>>1ll):-1ll);
  105. else if(s1!=s2) puts("-1");
  106. else
  107. {
  108. LL l=mx,r=INF,mid;
  109. while(l<r)
  110. {
  111. if(Check(mid=l+r>>1,s1,s2)) r=mid;
  112. else l=mid+1;
  113. }
  114. printf("%lld\n",l<INF?(1ll*(tot>>1)*l-s1/*(1ll*tot*l-s1-s2)>>1ll*/):-1ll);
  115. }
  116. }
  117. return 0;
  118. }

BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)的更多相关文章

  1. bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流

    2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4926  Solved: 1362[Submit][Stat ...

  2. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...

  3. BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1594  Solved: 396[Submit][Stat ...

  4. bzoj 2756 [SCOI2012]奇怪的游戏【二分+最大流】

    达成成就:为二分调参 !:多次memset的话要把数组大小开严格一点,否则会T 看到网格图,首先黑白染色. 注意到每次操作都是在一个黑格子和一个白格子上进行的,也就是说,最后黑格子数字和白格子数字和的 ...

  5. BZOJ 2756 SCOI2012 奇怪的游戏 最大流

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2756 Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N ...

  6. bzoj 2756: [SCOI2012]奇怪的游戏

    Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...

  7. 【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流

    这道题提醒我,要有将棋盘黑白染色的意识,尤其是看到相邻格子这样的条件的时候,然后就是要用到与其有关的性质与特点以体现其作用,这道题就是用到了黑格子与白格子之间的关系进行的,其出发点是每次一定会给一个黑 ...

  8. P5038 [SCOI2012]奇怪的游戏 二分+网络流

    $ \color{#0066ff}{ 题目描述 }$ Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 \(N \times M\) 的棋盘上玩,每个格子有一个数.每次\(Blinker\)会 ...

  9. 洛谷$P5038\ [SCOI2012]$奇怪的游戏 二分+网络流

    正解:二分+网络流 解题报告: 传送门$QwQ$ 这种什么,"同时增加",长得就挺网络流的$QwQ$?然后看到问至少加多少次,于是考虑加个二分呗?于是就大体确定了做题方向,用的网络 ...

随机推荐

  1. EB-GAN系(Energy-based GAN)

    学习总结于国立台湾大学 :李宏毅老师 EB-GAN: Energy-based Generative Adversarial Network MA-GAN:MAGAN: Margin Adaptati ...

  2. 【转载】Hadoop mapreduce 实现原理

    1.  如何用通俗的方法解释MapReduce MapReduce是Google开源的三大技术之一,是对海量数据进行“分而治之”计算框架.为了简单的理解并讲述给客户理解.我们举下面的例子来说明. 首先 ...

  3. SVN设置必须锁定

    SVN是一个开放源代码的版本控制系统,相信做开发的基本上都用过,这里就不多介绍了.团队协作开发时常常会出现提交的文档互相冲突的问题,这里给大家介绍一下给SVN文件设置必须锁定的方法,当然你也可以对冲突 ...

  4. 本体【Ontology】综述

    原文地址:http://blog.csdn.net/moonsheep_liu/article/details/22329873 本体作为一种能在语义和知识层次上描述领域概念的建模工具,其目标是捕获相 ...

  5. 53环境Jenkins新增工程配置

    1. 登录http://10.179.175.53:8080/环境. 2. 点击新建任务,输入任务名称,并在复制一个NOS的类似工程即可. 3. 在配置页面,修改源码地址: 4. 点击完成,执行构建, ...

  6. zabbix系列(七)zabbix3.0添加对tcp连接数及状态的监控

    原理: netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' TIME_WAIT 79 ESTABLISHED 6 LISTE ...

  7. zabbix系列(一)centos7搭建zabbix3.0.4服务端及配置详解

    1.安装常用的工具软件 yum install -y vim wget centos7关闭防火墙 systemctl stop firewalld.service systemctl disable ...

  8. InterruptedException 异常

    当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛InterruptedException的代表方法有: 1. jav ...

  9. python3 + selenium 使用 JS操作页面滚动条

    js2 = "window.scrollTo(0,0);" #括号中为坐标 当不知道需要的滚动的坐标大小时: weizhi2 = driver.find_element_by_id ...

  10. List中存放字符串进行排序

    package com.bjpowernode.t03sort; import java.util.ArrayList;import java.util.Collections; /* * List中 ...