bzoj 2756 [SCOI2012]奇怪的游戏【二分+最大流】
达成成就:为二分调参
!:多次memset的话要把数组大小开严格一点,否则会T
看到网格图,首先黑白染色。
注意到每次操作都是在一个黑格子和一个白格子上进行的,也就是说,最后黑格子数字和白格子数字和的差是不变的。
对于n*m%2==0的情况:
- 注意到在这种情况下黑格子和白格子一样多,也就是当黑格子数字和和白格子数字和不相等时,一定是不合法状态,反之一定合法。
- 那么二分最小的最终数字
对于于n*m%2==1情况:
- 注意到在这种情况下两种格子的数量差1,也就是说格子个数较多的一种格子的数字和与另一种格子的数字和之差就是最终数字。不合法状态之一即为数字之差比初始状态中数字最大的格子中的数字小。
- 那么判断是否合法
判断方法:
- 建立流量网络,s连向所有黑格子,所有白格子连向t,流量均为当前格子的值与最终数字之差,所有黑格子向与他相邻的白格子连流量为inf的边(黑白格子反过来也可以)
- 跑最大流,看是否全部满流,即可以通过一些方案使所有格子达到最终数字
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const long long N=55,P=25005,inf=1e11;
long long T,n,m,a[N][N],col[N][N],sum,le[P],cnt,h[P],s,t,mn,c0,c1,s0,s1;
struct qwe
{
long long ne,to,va;
}e[P<<1];
long long read()
{
long long r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(long long u,long long v,long long w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void ins(long long u,long long v,long long w)
{// cout<<u<<" "<<v<<" "<<w<<endl;
add(u,v,w);
add(v,u,0);
}
bool bfs()
{
memset(le,0,sizeof(le));
queue<long long>q;
le[s]=1;
q.push(s);
while(!q.empty())
{
long long u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(e[i].va>0&&!le[e[i].to])
{
le[e[i].to]=le[u]+1;
q.push(e[i].to);
}
}
return le[t];
}
long long dfs(long long u,long long f)
{
if(u==t||!f)
return f;
long long us=0;
for(int i=h[u];i&&us<f;i=e[i].ne)
if(e[i].va>0&&le[e[i].to]==le[u]+1)
{
long long t=dfs(e[i].to,min(e[i].va,f-us));
e[i].va-=t;
e[i^1].va+=t;
us+=t;
}
if(!us)
le[u]=0;
return us;
}
long long dinic()
{
long long re=0;
while(bfs())
re+=dfs(s,inf);
return re;
}
bool ok(long long c)
{
memset(h,0,sizeof(h));
long long sum=0ll;
cnt=1;s=0,t=n*m+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
long long x=(i-1)*m+j;
if(col[i][j])
{
ins(s,x,c-a[i][j]),sum+=c-a[i][j];
if(i!=1)
ins(x,(i-2)*m+j,inf);
if(i!=n)
ins(x,i*m+j,inf);
if(j!=1)
ins(x,(i-1)*m+j-1,inf);
if(j!=m)
ins(x,(i-1)*m+j+1,inf);
}
else
ins(x,t,c-a[i][j]);
}
return dinic()==sum;
}
int main()
{
T=read();
while(T--)
{
c0=c1=s0=s1=mn=0;
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
a[i][j]=read();
col[i][j]=(i+j)&1;
mn=max(mn,a[i][j]);
if(col[i][j])
s1+=a[i][j],c1++;
else
s0+=a[i][j],c0++;
}
if(c0!=c1)
{
long long x=(s0-s1)/1;
if(x>mn&&ok(x))
printf("%lld\n",x*c1-s1);
else
puts("-1");
}
else
{
if(s0!=s1)
{
puts("-1");
continue;
}
long long l=mn,r=inf;
while(l<=r)
{
long long mid=(l+r)>>1;
if(ok(mid))
r=mid-1;
else
l=mid+1;
}
printf("%lld\n",l*c1-s1);
}
}
return 0;
}
bzoj 2756 [SCOI2012]奇怪的游戏【二分+最大流】的更多相关文章
- bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流
2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4926 Solved: 1362[Submit][Stat ...
- BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)
题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- 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]奇怪的游戏
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- 【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流
这道题提醒我,要有将棋盘黑白染色的意识,尤其是看到相邻格子这样的条件的时候,然后就是要用到与其有关的性质与特点以体现其作用,这道题就是用到了黑格子与白格子之间的关系进行的,其出发点是每次一定会给一个黑 ...
- P5038 [SCOI2012]奇怪的游戏 二分+网络流
$ \color{#0066ff}{ 题目描述 }$ Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 \(N \times M\) 的棋盘上玩,每个格子有一个数.每次\(Blinker\)会 ...
- 洛谷$P5038\ [SCOI2012]$奇怪的游戏 二分+网络流
正解:二分+网络流 解题报告: 传送门$QwQ$ 这种什么,"同时增加",长得就挺网络流的$QwQ$?然后看到问至少加多少次,于是考虑加个二分呗?于是就大体确定了做题方向,用的网络 ...
随机推荐
- [洛谷U22156]未曾届到游览(矩阵树定理)
题目背景 又到了某任*堂开关中学一年一度的自主招生考试的时间了,在考试完后许多家长决定带着自己的孩子参观一下这所距千年名校还有890周年的百年学校: 题目描述 这所学校的布局非常奇怪,是一个由N 个点 ...
- HDU 3938
并查集的离线算法. 题意是大坑.理解为寻找两点之间所有路径中的最长的边的值小于输入的值的点对的个数. 直接来代码. #include<stdio.h> #include<iostre ...
- 从 modCount 看 java集合 fail-fast 机制
一.背景 在常见的Java的非线程安全集合类中(如HashMap.ArrayList),经常可以在一些修改结构的操作(如Add)中看到实例变量 modCount++ ,来统计集合的修改次数. 从注释也 ...
- Vue基础学习
使用vue-cli构建初始化vue项目 vue init webpack myfirst 项目截图:(开发工具:webStorm) 主要练习了vue的基本指令:v-bind.v-if.v-show.v ...
- 数据库中的DDL/DML/DCL解释(转)
DDL is Data Definition Language statements. Some examples:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 1.CREATE - ...
- arcengine 文件夹连接
Provides access to members that manages a GX catalog. Product Availability Available with ArcGIS Des ...
- 使用引导光盘,将你的PC变身瘦客户机
很多国内使用VMware View桌面虚拟化产品的朋友问我,是否可以将自己现有的PC改造成一台瘦客户机呢? 一方面即可以得到桌面虚拟化的管理,安全的好处,而且连前端PC机的系统管理的工作都省了? 答案 ...
- HOST绑定和VIP映射
今天上线需要配置RAL,处理半天,发现是需要HOST和IP分开来配. 比如: curl -H "Host: ktvin.nuomi.com" "http://10.207 ...
- UILable怎样加入单击事件
//初始化UILable UILabel *lable = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, 320, 40)]; //设置其能够接收用 ...
- UVA 4857 Halloween Costumes 区间背包
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...