看到相邻格子都+1的操作一下就想到黑白染色了
相邻格子都+1说明不管怎么弄,黑格子的总和和白格子总和的差总是定值
这里首先要注意,最后不一定变成的是所有元素中的最大值,可能比它大
比如 1 2 2 
     2 1 0  这里最后可以全变成3
所以做题的时候下结论一定要小心,我们不妨设最后都变成了x,c1,c2表示黑白格子个数,s1,s2分别表示原来黑白格子元素和
则x*c1-s1=x*c2-s2
则(c1-c2)*x=s1-s2
如果棋盘格子数为奇数,则,最后一定变成(s1-s2)/(c1-c2),我们只要验证这个即可
否则,当s1≠s2则无解
等于的话就有许多解,随着x的增大显然操作次数增多,所以我们二分x判定
如何判定呢?
我们将s连黑点,白点连t,流量是x-初始值
对相邻黑白点连inf的边,表示这两个格子可以共同+1
最后我们只要判断是否满流即可

 const inf=int64() shl ;
dx:array[..] of longint=(,,-,);
dy:array[..] of longint=(,-,,); type node=record
next,po:longint;
flow:int64;
end; var e:array[..] of node;
p,cur,pre,numh,h:array[..] of longint;
d:array[..] of int64;
num:array[..,..] of longint;
a:array[..,..] of int64;
test,t,i,n,m,j,k,len:longint;
ans,mx,s1,s2,l,r,mid:int64; function min(a,b:int64):int64;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y:longint;f:int64);
begin
inc(len);
e[len].po:=y;
e[len].flow:=f;
e[len].next:=p[x];
p[x]:=len;
end; procedure build(x,y:longint;f:int64);
begin
add(x,y,f);
add(y,x,);
end; function sap:int64;
var u,i,j,tmp,q:longint;
neck:int64; begin
fillchar(h,sizeof(h),);
fillchar(numh,sizeof(numh),);
for i:= to t do
cur[i]:=p[i];
neck:=inf;
numh[]:=t+;
u:=;
sap:=;
while h[]<t+ do
begin
d[u]:=neck;
i:=cur[u];
while i<>- do
begin
j:=e[i].po;
if (e[i].flow>) and (h[u]=h[j]+) then
begin
neck:=min(neck,e[i].flow);
cur[u]:=i;
pre[j]:=u;
u:=j;
if u=t then
begin
sap:=sap+neck;
while u<> do
begin
u:=pre[u];
j:=cur[u];
dec(e[j].flow,neck);
inc(e[j xor ].flow,neck);
end;
neck:=inf;
end;
break;
end;
i:=e[i].next;
end;
if i=- then
begin
dec(numh[h[u]]);
if numh[h[u]]= then exit;
q:=-;
tmp:=t;
i:=p[u];
while i<>- do
begin
j:=e[i].po;
if (e[i].flow>) and (h[j]<tmp) then
begin
tmp:=h[j];
q:=i;
end;
i:=e[i].next;
end;
cur[u]:=q;
h[u]:=tmp+;
inc(numh[h[u]]);
if u<> then
begin
u:=pre[u];
neck:=d[u];
end;
end;
end;
end; function check(w:int64):boolean;
var i,j,x,y:longint;
s:int64;
begin
len:=-;
s:=;
fillchar(p,sizeof(p),);
for i:= to n do
for j:= to m do
if (i+j) mod = then build(num[i,j],t,w-a[i,j])
else begin
build(,num[i,j],w-a[i,j]);
for k:= to do
begin
x:=i+dx[k];
y:=j+dy[k];
if num[x,y]> then build(num[i,j],num[x,y],inf);
end;
s:=s+w-a[i,j];
end; if sap<>s then exit(false)
else begin
ans:=s;
exit(true);
end;
end; begin
readln(test);
while test> do
begin
dec(test);
readln(n,m);
fillchar(num,sizeof(num),);
s1:=;
s2:=;
k:=;
mx:=;
for i:= to n do
for j:= to m do
begin
read(a[i,j]);
inc(k);
num[i,j]:=k;
if (i+j) mod = then s1:=s1+a[i,j]
else s2:=s2+a[i,j];
if a[i,j]>mx then mx:=a[i,j];
end;
t:=n*m+;
ans:=-;
if n*m mod = then
begin
if (mx<=s1-s2) and check(s1-s2) then writeln(ans)
else writeln(-);
end
else begin
if s1<>s2 then writeln(-)
else begin
l:=mx;
r:=int64() shl ;
while l<=r do
begin
mid:=(l+r) shr ;
if check(mid) then r:=mid-
else l:=mid+;
end;
writeln(ans);
end;
end;
end;
end.

bzoj2756的更多相关文章

  1. 【BZOJ2756】奇怪的游戏(二分,最小割)

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

  2. BZOJ2756 SCOI2012奇怪的游戏(二分答案+最大流)

    由数据范围容易想到网络流.由于操作只是对于棋盘上相邻两格,容易想到给其黑白染色. 假设已经知道最后要变成什么数.那么给黑白点之间连边,其流量则表示同时增加的次数,再用源汇给其限流为需要增加的数即可. ...

  3. 【BZOJ2756】奇怪的游戏(二分,网络流)

    [BZOJ2756]奇怪的游戏(二分,网络流) 题面 BZOJ Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blink ...

  4. 【BZOJ-2756】奇怪的游戏 最大流 + 分类讨论 + 二分

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

  5. Bzoj2756 [SCOI2012]奇怪的游戏

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3220  Solved: 886 Description ...

  6. BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论

    这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...

  7. BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)

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

  8. 【bzoj2756 奇怪的游戏】

    Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4403  Solved: 1226[Submit][Status][Discuss] Descript ...

  9. BZOJ2756 [SCOI2012]奇怪的游戏 【网络流 + 二分】

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

随机推荐

  1. ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

    http://wandering192.iteye.com/blog/758954 谢谢作者

  2. 新安装Eclipse后的一些配置

    配置护眼的背景色 Window-> Preferences-> General-> Editors-> Text Editors: Appearance color optio ...

  3. 05_XML的解析_01_dom4j 解析

    [简述] Xml文件出了给开发者看,更多情况使用程序读取xml文件里的内容,这叫做xml解析. 根据解析方式分为:DOM解析 和 SAX解析 [解析工具] (一). 使用DOM解析原理的工具: 1.J ...

  4. C语言 宏/macor/#define/

    C语言 宏/macor/#define 高级技巧 1.在进行调试的时候,需要进行打印/PRINT,可以通过define进行自定义.例如,自己最常用的DEBUG_PRINT() #define DEBU ...

  5. 在Windows下用MingW 4.5.2编译live555

    1.下载live555(http://www.live555.com/liveMedia/public/),解压. 2.进入MingW Shell,输入cd: F:/Qt/live(假定解压到F:/Q ...

  6. outlet删除不完全

    今天在用iOS写个计算器的时候,遇到的一个小bug,新手,太新了,不之所错. 直接上码: Terminating app due to uncaught exception 'NSUnknownKey ...

  7. grunt学习

    有些时候,项目中的静态资源,比如图片占用的文件有点大,影响加载的速度,所以会选择grunt对其进行压缩打包.对于grunt其他的用法,还在继续学习中,先记录下关于grunt的一些学习. grunt是一 ...

  8. 使用curl获取网站的http的状态码

    发布:thebaby   来源:net     [大 中 小] 本文分享一例shell脚本,一个使用curl命令获取网站的httpd状态码的例子,有需要的朋友参考下.本文转自:http://www.j ...

  9. Extension method for type

    扩展其实真的很简单 msdn是这样规定扩展方法的:"扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为 ...

  10. TortoiseSVN文件夹及文件图标不显示解决方法 [转]

    由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案 ...