bzoj 2756
思路:
二分讨论,网络流检验;
代码:
#include <bits/stdc++.h>
using namespace std;
#define INF 1e16
#define maxn 40005
#define ll long long
const ll dx[]={,-,,,};
const ll dy[]={,,,,-};
ll ai[][],id[][],suma,sumb,cnta,cntb,que[maxn],Max,ans;
ll deep[maxn],E[maxn],V[maxn],F[maxn],cnt,head[maxn],s,t,cntid;
ll n,m;
bool col[][];
inline void in(ll &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
inline void edge_add(ll u,ll v,ll f)
{
E[++cnt]=head[u],V[cnt]=v,F[cnt]=f,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,F[cnt]=,head[v]=cnt;
}
bool bfs()
{
for(ll i=s;i<=t;i++) deep[i]=-;
deep[s]=,que[]=s;ll h=,tail=,now;
while(h<tail)
{
now=que[h++];
for(ll i=head[now];i;i=E[i])
if(F[i]&&deep[V[i]]==-)
{
deep[V[i]]=deep[now]+;
if(V[i]==t) return true;
que[tail++]=V[i];
}
}
return false;
}
ll flowing(ll now,ll flow)
{
if(now==t||flow<=) return flow;
ll oldflow=,pos;
for(ll i=head[now];i;i=E[i])
{
if(!F[i]||deep[V[i]]!=deep[now]+) continue;
pos=flowing(V[i],min(flow,F[i]));
F[i]-=pos,F[i^]+=pos,oldflow+=pos,flow-=pos;
if(!flow) return oldflow;
}
if(!oldflow) deep[now]=-;
return oldflow;
}
bool check(ll x)
{
for(ll i=s;i<=t;i++) head[i]=;cnt=;
for(ll i=;i<=n;i++)
for(ll v=;v<=m;v++)
if(col[i][v])
{
edge_add(s,id[i][v],x-ai[i][v]);
for(ll e=;e<=;e++)
if(i+dx[e]>&&i+dx[e]<=n&&v+dy[e]>&&v+dy[e]<=m) edge_add(id[i][v],id[i+dx[e]][v+dy[e]],INF);
}
else edge_add(id[i][v],t,x-ai[i][v]);
ll res=;
while(bfs()) res+=flowing(s,INF);
return res==(x*cnta-suma);
}
int main()
{
freopen("data.txt","r",stdin);
ll T;in(T);
while(T--)
{
in(n),in(m),suma=,sumb=,cnta=,cntb=,cntid=,Max=;
for(ll i=;i<=n;i++)
for(ll v=;v<=m;v++)
{
in(ai[i][v]),col[i][v]=(i+v)%;
if(col[i][v]) suma+=ai[i][v],cnta++;
else sumb+=ai[i][v],cntb++;
id[i][v]=++cntid,Max=max(Max,ai[i][v]);
}
ans=-,s=,t=cntid+;
if(cnta!=cntb)
{
if((suma-sumb)%(cnta-cntb)==)
{
ll x=(suma-sumb)/(cnta-cntb);
if(x>=Max) if(check(x)) ans=x*cnta-suma;
}
}
else
{
if(suma==sumb)
{
ll l=Max,r=INF,mid;
while(l<=r)
{
mid=l+r>>;
if(check(mid)) r=mid-,ans=mid;
else l=mid+;
}
if(ans!=-) ans=ans*cnta-suma;
}
}
printf("%lld\n",ans);
}
return ;
}
bzoj 2756的更多相关文章
- [BZOJ 2756] 奇怪的游戏
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2756 Algorithm: 比较新颖的题目 首先发现是对矩阵中相邻两数进行操作 & ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- bzoj 2756奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Description Blinke 最近喜欢上一个奇怪的游戏. 这个游戏 ...
- BZOJ 2756 奇怪的游戏(最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2756 题意:在一个 N*M 的棋盘上玩,每个格子有一个数.每次 选择两个相邻的格子,并使 ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1594 Solved: 396[Submit][Stat ...
- BZOJ 2756 SCOI2012 奇怪的游戏 最大流
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2756 Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N ...
- bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流
2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4926 Solved: 1362[Submit][Stat ...
- bzoj 2756: [SCOI2012]奇怪的游戏
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)
题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...
随机推荐
- django 线上教育平台开发记录
1.环境搭建 2.新建项目 1).首先通过 django-admin 新建一个项目,(例如项目名为mxonline) django-admin startproject mxonline 运行后会出现 ...
- Java Socket Timeout 总结
原文出处:囚兔 摘要: Java的网络编程Socket常常用于各种网络工具,比如数据库的jdbc客户端,redis客户端jedis,各种RPC工具java客户端,这其中存在一些参数来配置timeout ...
- element ui 栅格布局
<el-row> <el-col :span="24"><div class="grid-content bg-purple-dark&qu ...
- LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵
https://loj.ac/problem/6030 如果矩阵第i列有一个黑色, 那可以用他把第i行全都染黑,也可以使任意一列具有黑色 然后就可以用第i行把矩阵染黑 染黑一列的代价最少是1 染黑一行 ...
- codevs 3369 膜拜(线型)
3369 膜拜 http://codevs.cn/problem/3369/ 题目描述 Description 神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.某学校有两位神牛,神牛甲和神牛乙.新入 ...
- CF869 C 组合
先吐槽下,题面套的物语系列欸.. 由于距离为3,那么必定两种颜色间要填入第3种颜色,否则就是单独点的情况,那么两两之间可以单独考虑而不影响答案,枚举两种颜色之间边数,计算一边的组合和另一边的排列,最后 ...
- Docker删除镜像报错
问题描述: 笔者意图删除nginx-file的镜像文件,但通过命令删除镜像时出现报错信息,提示存在多个引用(即一个IMAGE可被多个REPOSITORY引用,故删除会出现失败),如下: [root@k ...
- js截取字符串substr和substring的区别
定义substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符.substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法substr() str ...
- Python 豆瓣顶帖
由于在豆瓣发了个租房帖子,发现很快就被其他的帖子淹没,但是手动顶帖实在太累,
- 矩阵 matrix
传送门 注意这题时限是2s [问题描述] 有一个n × m的矩阵,你从左上角走到右下角,只能向下和向右走. 每个点上有一个重量v i,j 价值w i,j 的物品,你有一个容量为S的背包,经过一个点你可 ...