bzoj2756
看到相邻格子都+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的更多相关文章
- 【BZOJ2756】奇怪的游戏(二分,最小割)
题意: Blinker最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blinker 想知道最 ...
- BZOJ2756 SCOI2012奇怪的游戏(二分答案+最大流)
由数据范围容易想到网络流.由于操作只是对于棋盘上相邻两格,容易想到给其黑白染色. 假设已经知道最后要变成什么数.那么给黑白点之间连边,其流量则表示同时增加的次数,再用源汇给其限流为需要增加的数即可. ...
- 【BZOJ2756】奇怪的游戏(二分,网络流)
[BZOJ2756]奇怪的游戏(二分,网络流) 题面 BZOJ Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blink ...
- 【BZOJ-2756】奇怪的游戏 最大流 + 分类讨论 + 二分
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2925 Solved: 792[Submit][Stat ...
- Bzoj2756 [SCOI2012]奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3220 Solved: 886 Description ...
- BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...
- BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- 【bzoj2756 奇怪的游戏】
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4403 Solved: 1226[Submit][Status][Discuss] Descript ...
- BZOJ2756 [SCOI2012]奇怪的游戏 【网络流 + 二分】
题目 Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 Blinker 想知 ...
随机推荐
- 折腾ghost。。。
1.启动 NODE_ENV=production node index.js 如果出现启动不了的情况,在该命令加sudo sudo NODE_ENV=production node index.js ...
- CSS3滤镜!!!
<!DOCTYPE html> <html> <head> <style> img { width: 33%; height: auto; float: ...
- [LCA & RMQ] [NOIP2013] 货车运输
首先看到这题, 由于要最大, 肯定是求最大生成树 那么 o(n2) dfs 求任意点对之间的最小边是可以想到的 但是看看数据范围肯定TLE 于是暴力出来咯, 不过要注意query的时候判断的时候要 m ...
- Angle
1 What is Angle. The goal of ANGLE is to allow Windows users to seamlessly run WebGL and other OpenG ...
- textarea限定字数提示效果
最近工作中要实现的一个效果是:在textarea中输入字符会提示剩余多少字符可输入.于是马不停蹄的开始查阅资料. HTML代码: <table> <colgroup> < ...
- C#使用oledb方式将excel数据导入到datagridview后数据被截断为 255 个字符
问题描述:在使用oledb方式将excel数据导入到datagridview中,在datagridview单元格中的数据没有显示全,似乎只截取了数据源中的一段 解决方案:1.关于该问题,微软官方答案: ...
- Cassandra1.2文档学习(9)—— 数据写入
数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/manage_dml ...
- PHPCMS 核心代码与 www 分离部署
为了满足更多用户二次开发的兴趣与爱好,同时,为了更加安全.可以通过修改入口代码的包含方式来让主程序和www程序分开. 先看下面目录结构: (图1) 我们需要将 phpcms 目录和 index.php ...
- mysql 远程连接 1045 Access denied for user 'root'@'XX.XX.XX.XX' (using password:YES)
用户名/密码错误,需要输入开放远程时设置的密码
- 制作进度条(UISlider)
怎样判断是否应当使用进度条 用进度条的主要目的是为了用一根管子的充满程度来直观地表示某种数值的百分比,进度条分为可拖动和不可拖动两种. 可拖动进度条和不可拖动进度条的原理几乎是一模一样,唯一的区别是可 ...