题意:

Blinker最近喜欢上一个奇怪的游戏。
这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数。每次 Blinker 会选择两个相邻
的格子,并使这两个数都加上 1。
现在 Blinker 想知道最少多少次能使棋盘上的数都变成同一个数,如果永远不能变成同
一个数则输出-1。

n,m<=40 a[i,j]<=10^9

思路:假设我们已经询问最终是否都能变成数字D怎么做?

注意到黑白点染色后每次加的点必定是1黑点1白点

设黑格子有k1个,和为s1,白格子有k2个,和为s2

显然k1*d-s1=k2*d-s2

d=(s1-s2)/(k1-k2)

当k1<>k2时D可以直接被计算出,用网络流验证即可,注意当D<max(a[i,j])时显然不可能完成

当k1=k2时注意到每次加必定黑+1,白+1,如果s1<>s2就不可能完成

又因为此时n*m为偶数,任意的D如果符合要求,任意的D'>D必定符合要求

因为总个数为偶数时必定可以设计出方案使所有数都+1

所以可以二分答案,找到最小的能被取到的D,同样用网络流验证

网络流验证:

S——>黑点 流量为D-a[i,j]

白点——>T 流量为D-a[i,j]

黑点——>相邻的白点 流量为oo

看最小割是否等于需要被加上的总和即可,因为每个黑点只向相邻的白点连边所以一个最小割就对应了一个操作的方案

另外二分上界只需要2^50,太大会炸

num数组一定要动态开,直接设完全部会导致标号不连续调了一天全是泪

 const oo=<<;
dx:array[..]of longint=(-,,,);
dy:array[..]of longint=(,,-,);
var head,gap,dis:array[..]of longint;
vet,next,fan:array[..]of longint;
len:array[..]of int64;
num,a:array[..,..]of longint;
n,m,i,j,tot,k1,k2,s,source,src,cas,v,mx:longint;
l,r,mid,last,s1,s2,k:int64; procedure add(a,b:longint;c:int64);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot; inc(tot);
next[tot]:=head[b];
vet[tot]:=a;
len[tot]:=;
head[b]:=tot;
end; function min(x,y:int64):int64;
begin
if x<y then exit(x);
exit(y);
end; function dfs(u:longint;aug:int64):int64;
var e,v,val:longint;
flow,t:int64;
begin
if u=src then exit(aug);
e:=head[u]; val:=s-; flow:=;
while e<> do
begin
v:=vet[e];
if len[e]> then
begin
if dis[u]=dis[v]+ then
begin
t:=dfs(v,min(len[e],aug-flow));
len[e]:=len[e]-t;
len[fan[e]]:=len[fan[e]]+t;
flow:=flow+t;
if dis[source]>=s then exit(flow);
if aug=flow then break;
end;
val:=min(val,dis[v]);
end;
e:=next[e];
end;
if flow= then
begin
dec(gap[dis[u]]);
if gap[dis[u]]= then dis[source]:=s;
dis[u]:=val+;
inc(gap[dis[u]]);
end;
exit(flow);
end; function maxflow:int64;
var ans:int64;
begin
fillchar(gap,sizeof(gap),);
fillchar(dis,sizeof(dis),);
gap[]:=s; ans:=;
while dis[source]<s do ans:=ans+dfs(source,oo);
exit(ans);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; function isok(k:int64):boolean;
begin
if k*k1-s1=maxflow then exit(true);
exit(false);
end; procedure build(k:int64);
var i,j,l,x,y:longint;
begin
fillchar(head,sizeof(head),); tot:=;
for i:= to n do
for j:= to m do
if (i+j) mod = then
begin
for l:= to do
begin
x:=i+dx[l]; y:=j+dy[l];
if (x>)and(x<=n)and(y>)and(y<=m) then add(num[i,j],num[x,y],oo);
end;
end; for i:= to n do
for j:= to m do
if (i+j) mod = then add(source,num[i,j],k-a[i,j])
else add(num[i,j],src,k-a[i,j]);
end; begin
assign(input,'bzoj2756.in'); reset(input);
assign(output,'bzoj2756.out'); rewrite(output);
read(cas);
for i:= to do
if i mod = then fan[i]:=i+
else fan[i]:=i-;
// for i:= to do
// for j:= to do num[i,j]:=(i-)*+j;
for v:= to cas do
begin
read(n,m);
s1:=; s2:=; k1:=; k2:=; mx:=-maxlongint;
for i:= to n do
for j:= to m do
begin
read(a[i,j]);
if (i+j) mod = then begin inc(k1); s1:=s1+a[i,j]; end
else begin inc(k2); s2:=s2+a[i,j]; end;
mx:=max(mx,a[i,j]); num[i,j]:=(i-)*m+j;
end;
s:=n*m+; source:=n*m+; src:=n*m+;
if k1<>k2 then
begin
k:=(s1-s2) div (k1-k2);
if k<mx then writeln(-)
else
begin
build(k);
if isok(k) then writeln(k*k1-s1)
else writeln(-);
end;
end
else
begin
if s1<>s2 then writeln(-)
else
begin
l:=mx; r:=oo; last:=oo;
while l<=r do
begin
mid:=(l+r)>>;
build(mid);
if isok(mid) then begin last:=mid; r:=mid-; end
else l:=mid+;
end;
writeln(last*k1-s1);
end;
end; end; close(input);
close(output);
end.

【BZOJ2756】奇怪的游戏(二分,最小割)的更多相关文章

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

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

  2. 最大密集子图(01分数规划+二分+最小割)POJ3155

    题意:给出一副连通图,求出一个子图令g=sigma(E)/sigma(V); h[g]=sigma(E)-g*sigma(V):设G是最优值 则当h[g]>0:g<G h[g]<0, ...

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

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

  4. 【bzoj2756 奇怪的游戏】

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

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

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

  6. 【二分 最小割】cf808F. Card Game

    Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...

  7. poj 3155 二分+最小割求实型最小割(最大密集子图)

    /* 最大密集子图子图裸题 解法:设源点s和汇点t 根据胡波涛的<最小割模型在信息学中的应用> s-每个点,权值为原边权和m, 每个点-t,权值为m+2*g-degree[i], 原来的边 ...

  8. BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)

    题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...

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

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

  10. [bzoj2756]奇怪的游戏

    对棋盘黑白染色后,若n和m都是奇数(即白色和黑色点数不同),可以直接算得答案(根据白-黑不变):若n和m不都是奇数,二分答案(二分的上限要大一点,开$2^50$),最后都要用用网络流来判定.考虑判定, ...

随机推荐

  1. LeetCode 【46. Permutations】

    Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] have t ...

  2. Spring源码学习之:ClassLoader学习(1)

    转载:http://longdick.iteye.com/blog/442213 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloade ...

  3. 如何做好APP测试?

    测试一个App具体包括哪些方面,以及每个方面有什么关键点呢? 测试人员常被看作bug寻找者,但你曾想过他们实际是如何开展测试的吗? 你是否好奇他们究竟都做些什么,以及他们如何在一个典型的技术项目中体现 ...

  4. MSSQL 创建自定义异常

    创建时,必须先创建英文的,否则会报错:必须添加此消息的 us_english 版本后,才能添加 '简体中文' 版本. EXEC sp_addmessage 50001, 15, 'option wro ...

  5. HA(High available)-Keepalived高可用性集群(双机热备)单点实验-菜鸟入门级

    HA(High available)-Keepalived高可用性集群   Keepalived 是一个基于VRRP虚拟路由冗余协议来实现的WEB 服务高可用方案,虚拟路由冗余协议 (Virtual ...

  6. C# :GDI+技术生成复杂型彩色验证码(转载)

    该类是生成一个验证码的类,集合了网上大部分的C#关于GDI+的文章进行多次改进,现在已经形成了可在生产环节中使用的验证码. 该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字以及扭曲,调暗,模糊 ...

  7. 使用springMVC实现文件上传和下载之环境配置与上传

    最近的项目中用到了文件的上传和下载功能,任务分配给了其他的同时完成.如今项目结束告一段落,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 一. 基础配置: maven导包及配置pom.x ...

  8. Happen-before

    http://blog.csdn.net/ns_code/article/details/17348313

  9. C# 时间类型

    字符型转换为字符串// C 货币 2.5.ToString("C"); // ¥2.50 // D 10进制数 25.ToString("D5"); // 25 ...

  10. WCF使用小结:(1)WCF接收HTTP POST数据的处理方法

    在WCF 4.0中,为我们创建Restful API有了更好的支持.通过定义UriTemplate,WebInvoke就可以快速开发API接口. 这里我记录一下HTTP POST数据时要如何接收POS ...