正解:二分+网络流

解题报告:

传送门$QwQ$

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

然后就考虑怎么建图呗$QwQ$

首先考虑二分出每个点的值,然后就可以根据这个值求出每个点要增加的多少以及总的修改次数

然后相邻显然考虑黑白染色黑连$S$白连$T$彼此之前连$inf$,跑个最大流判断跑满了没有.

感觉好像要做完辣?

但是这时候要注意到一个问题$QwQ$,就说不能证明这个次数有可二分性$kk$

考虑如果$n\cdot m$为偶数,那显然可二分,因为如果$d$是可行的,那给每个格子都加一就变成了$d+1$显然也可行.

但是如果$n\cdot m$为奇数,发现当$d$可行时并不一定$d+1$可行,,,$QAQ$所以考虑当$n\cdot m$为奇数的时候换一种考虑方法?$QwQ$

考虑设$num_{0/1},sum_{0/1}$表示黑白格的数量和分别的$a$之和,$x$表示最终每个数的值,因为每次一定是一黑一白同时加,所以有$num_{0}\cdot x=sum_{0},num_{1}\cdot x=sum_{1}$,然后可以直接解出$x$然后$check$下就好$QwQ$

$over$!

$upd:$

一周过去我又回来看这题辣,,,$QwQ$

昂说下$T$哪儿了趴

就有个很有效的优化,是在$dinic$中当$flow=0$的时候就可以直接$return$了,,,我挂这儿好多次,,,$QAQ$

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define int long long
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define n(i) edge[i].nxt
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,M=+,inf=(ll)3e15;
int n,m,dep[N],head[N],cur[N],S,T,ed_cnt=-,l,r,d,a[M][M],sum[],tot[],as;
int mvx[]={,,,-},mvy[]={,-,,};
struct ed{int to,nxt,wei;}edge[N<<]; il int max(ri x,ri y){return x>y?x:y;}
il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int nam(ri x,ri y){return (x-)*m+y;}
il void ad(ri x,ri y,ri z)
{edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();
e(i,nw)if(w(i) && !dep[t(i)]){dep[t(i)]=dep[nw]+,Q.push(t(i));if(t(i)==T)return ;}
}
return ;
}
il int dfs(ri nw,ri flow)
{
if(nw==T || !flow)return flow;ri ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i) && dep[t(i)]==dep[nw]+)
{ri tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;if(!flow)return ret;}
if(!ret)dep[nw]=;
return ret;
}
il int dinic(){ri ret=;while(bfs()){rp(i,S,T)cur[i]=head[i];while(int d=dfs(S,inf))ret+=d;}return ret;}
il bool check(ri x)
{
// printf("--- check(%d) ---\n",x);
memset(head,-,sizeof(head));ed_cnt=-;ri ret=;
rp(i,,n)
{
rp(j,,m)
{
if((i+j)&)ad(nam(i,j),S,x-a[i][j]),ret+=x-a[i][j];
else
{
ad(T,nam(i,j),x-a[i][j]);
rp(k,,){ri tx=i+mvx[k],ty=j+mvy[k];if(tx && ty && tx<=n && ty<=m)ad(nam(i,j),nam(tx,ty),inf);}
}
}
}
// printf("--- check(%d) ---\n",x);
return dinic()==ret;
} main()
{
//freopen("5038.in","r",stdin);freopen("5038.out","w",stdout);
ri tmp=read();
while(tmp--)
{
l=;r=1ll<<;n=read();m=read();S=;T=n*m+;
rp(i,,n)rp(j,,m)a[i][j]=read(),l=max(l,a[i][j]);
sum[]=sum[]=tot[]=tot[]=;rp(i,,n)rp(j,,m)sum[(i+j)&]+=a[i][j],++tot[(i+j)&];
if((n*m)&)
{
ri x=(sum[]-sum[])/(tot[]-tot[]);
if(check(x))printf("%lld\n",1ll*x*tot[]-sum[]);else printf("-1\n");
}
else
{
if(sum[]!=sum[] || !check(r)){printf("-1\n");continue;}
while(l<r){ri mid=(l+r)>>;if(check(mid))r=mid;else l=mid+;}
printf("%lld\n",l*tot[]-sum[]);
}
}
return ;
}

洛谷$P5038\ [SCOI2012]$奇怪的游戏 二分+网络流的更多相关文章

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

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

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

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

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

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

  4. [题目] Luogu P5038 [SCOI2012]奇怪的游戏

    学习资料 -----1----- -----2----- P5038 [SCOI2012]奇怪的游戏 一道甚神但没用到高深模型的题 思路 没思路,看题解吧 代码 #include <iostre ...

  5. 洛谷——P1747 好奇怪的游戏

    P1747 好奇怪的游戏 题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大 ...

  6. 洛谷 P1747 好奇怪的游戏

    P1747 好奇怪的游戏 题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大 ...

  7. 题解 P5038 [SCOI2012]奇怪的游戏

    题解 题目 做这题之前,做了一道叫星际战争的题,很容易想到二分 \(+\) 网络流,那么二分啥呢? 我们先推一下式子,因为是对相邻格子加数,那么可以联想到黑白染色类问题. 设有黑色格子 \(B\) 个 ...

  8. 洛谷5038 [SCOI2012]奇怪的游戏(二分+网络流+判断奇偶)

    寒假的时候就听过这个题.但是一直没有写. qwq 首先,我们发现题目中的图是个网格图,然后每次可以将相邻两个格子加一. 很容易就想到是黑白染色.那么每次操作,就相当于同时操作一个白点,一个黑点. 我们 ...

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

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

随机推荐

  1. Mysql 查询一天中每半小时记录的数量

    SELECT HOUR(e.time)as Hour,FLOOR(MINUTE(e.time)/30) as M, COUNT(*) as Count FROM error_log e WHERE e ...

  2. @loj - 2339@ 「WC2018」通道

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 11328 年,C 国的科学家们研发了一种高速传送通道,可以在很短的 ...

  3. oracle的group by用法

    原文链接:https://www.cnblogs.com/Each-Person-Got-a-Dream/p/8946961.html sql如下: select min(es.sku_price) ...

  4. ubuntu14.04 编译hadoop-2.6.0-cdh5.4.4

    1 protocol buffer sudo apt-get install libprotobuf-dev asn@hadoop1:~/Desktop$ protoc --version libpr ...

  5. MySQL高级配置

    参考文章:http://www.jb51.net/article/47419.htm https://blog.csdn.net/waneto2008/article/details/52502208 ...

  6. 4-3 调试代码命令 scrapy shell http://blog.jobbole.com/114496/(入口url)

    调试代码命令 scrapy shell http://blog.jobbole.com/114496/(入口url)

  7. python基础数据类型汇总

    list和dict 在循环一个列表和字典时,最好不要删除其中的元素,这样会使索引发生改变,从而报错! lis = [11, 22, 33, 44, 55] for i in range(len(lis ...

  8. H5 存储数据sessionStorage

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 2018-11-8-WPF-获取下载内容长度

    title author date CreateTime categories WPF 获取下载内容长度 lindexi 2018-11-08 20:18:15 +0800 2018-11-08 20 ...

  10. 机器学习——集成学习之Boosting

    整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 AdaBoost GB ...