洛谷$P5038\ [SCOI2012]$奇怪的游戏 二分+网络流
正解:二分+网络流
解题报告:
这种什么,"同时增加",长得就挺网络流的$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]$奇怪的游戏 二分+网络流的更多相关文章
- P5038 [SCOI2012]奇怪的游戏 二分+网络流
$ \color{#0066ff}{ 题目描述 }$ Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 \(N \times M\) 的棋盘上玩,每个格子有一个数.每次\(Blinker\)会 ...
- bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流
2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4926 Solved: 1362[Submit][Stat ...
- BZOJ2756 [SCOI2012]奇怪的游戏 【网络流 + 二分】
题目 Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 Blinker 想知 ...
- [题目] Luogu P5038 [SCOI2012]奇怪的游戏
学习资料 -----1----- -----2----- P5038 [SCOI2012]奇怪的游戏 一道甚神但没用到高深模型的题 思路 没思路,看题解吧 代码 #include <iostre ...
- 洛谷——P1747 好奇怪的游戏
P1747 好奇怪的游戏 题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大 ...
- 洛谷 P1747 好奇怪的游戏
P1747 好奇怪的游戏 题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大 ...
- 题解 P5038 [SCOI2012]奇怪的游戏
题解 题目 做这题之前,做了一道叫星际战争的题,很容易想到二分 \(+\) 网络流,那么二分啥呢? 我们先推一下式子,因为是对相邻格子加数,那么可以联想到黑白染色类问题. 设有黑色格子 \(B\) 个 ...
- 洛谷5038 [SCOI2012]奇怪的游戏(二分+网络流+判断奇偶)
寒假的时候就听过这个题.但是一直没有写. qwq 首先,我们发现题目中的图是个网格图,然后每次可以将相邻两个格子加一. 很容易就想到是黑白染色.那么每次操作,就相当于同时操作一个白点,一个黑点. 我们 ...
- BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)
题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...
随机推荐
- oracle函数 VSIZE(X)
[功能]返回X的大小(字节)数 [参数]x select vsize(user),user from dual; 返回:6 asdied select length('adfad合理') " ...
- mysql 优化 1
一. 数据库索引 规则8:业务需要的相关索引是根据实际的设计所构造sql语句的where条件确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多余的字段,特别是该字段根本不会在条件语句中 ...
- laravel 学习笔记blog后台
https://github.com/almasaeed2010/adminlte composer require "almasaeed2010/adminlte=~2.0"
- WebStorm使用参考手册
WebStorm 是 JetBrains 推出的一款商业的 JavaScript 开发工具 任何一个编辑器都需要保存(ctrl + s),这是所有win平台上编辑类软件的特点,但是webstorm编辑 ...
- 【原生JS】切换选项卡
效果图: HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- Python--day69--ORM外键的正向查询和反向查询
什么是正向查询,什么是方向查询?
- Git篇
安装之后第一步 安装 Git 之后,你要做的第一件事情就是去配置你的名字和邮箱,因为每一次提交都需要这些信息: git config --global user.name "bukas&qu ...
- axios 跨域
{ headers:{"Content-Type":"application/x-www-form-urlencoded;charset=utf-8"} ...
- Python--day31--UDP协议的socket通信
- P1110 变身
题目描述 给你一个长度为n的数组a,他们的坐标从1到n,并且他们的数值也在1到n之间且两两不同. 数组中的每个元素每轮回合都会变身,变身的结果取决于该元素当前的值,如果在某一个回合该元素的值为u,则下 ...