看到相邻格子都+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. Java多线程--同步函数

    /*需求:银行有一个金库有两个储户分别存300元 每次存100元,存3次 目的:该程序是否有安全问题,如果有,如何解决? 如何找问题(很重要)1.明确哪些代码是多线程运行代码2.明确共享数据3.明确多 ...

  2. 用Python进行语音信号处理

    1.语音信号处理之时域分析-音高追踪及其Python实现 2.语音信号处理之时域分析-音高及其Python实现 参考: 1.NumPy

  3. 以boost::function和boost:bind取代虚函数

    转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...

  4. 鸟哥笔记:linux系统日志文件介绍

    简单的说日志文件就是记录系统活动信息的几个文件,例如:何时.何地(来源ip).何人(什么服务名称).做了什么操作.换句话说就是:记录系统在什么时候由哪个进程做了什么样的行为时,发生了什么事件等. 日志 ...

  5. apache 工作模式

    apache三种工作模式: prefork(2.4前默认)/worker/event(2.4默认)内容整理来自以下网站http://m.blog.csdn.net/article/details?id ...

  6. html5在手机端关于 map area中的自适应

    https://github.com/stowball/jQuery-rwdImageMaps用这一个插件可自适应!!!

  7. 1. Window环境下 - 开发环境的配置: (安装Android Studio 2.1)

    0. Java简介: 1990年Sun公司预料嵌入式系统将在未来家用电器领域大显生手, 于是成立了一个由James Gosling领导的"Green计划"(首席科学家Bill Jo ...

  8. JavaScript事件总结

    JavaScript 事件总结   本文总结自<JavaScript高级程序设计>以及自己平时的经验,针对较新浏览器以及 DOM3 级事件标准(2016年8月),对少部分内容作了更正,增加 ...

  9. UDP TCP应用场景

    作者:陈硕链接:https://www.zhihu.com/question/20060141/answer/26735814来源:知乎著作权归作者所有,转载请联系作者获得授权. UDP 的使用范围很 ...

  10. RepeatedDNASequences BestTime_to_Buy_and_SellStockIV

    /** * @Author: weblee * @Email: likaiweb@163.com * @Blog: http://www.cnblogs.com/lkzf/ * @Time: 2015 ...