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$?然后看到问至少加多少次,于是考虑加个二分呗?于是就大体确定了做题方向,用的网络 ...
随机推荐
- OO第三单元总结——JML
目录 写在前面 JML理论基础 JML工具链 JMLUnitNG的使用 架构设计 Bug分析 心得体会 写在前面 OO的第三单元学习结束了,本单元我们学习了如何使用JML语言来对我们的程序进行规格化设 ...
- MySQL错误日志、binlog日志、查询日志、慢查询日志简介
1.数据库的日志是帮助数据库管理员,追踪分析数据库曾经发生的各种事件的有力依据,mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决以下问题:各个日志的作 ...
- POJ 3264 Balanced Lineup(RMQ_ST)
题目链接:http://poj.org/problem? id=3264 Description For the daily milking, Farmer John's N cows (1 ≤ N ...
- 【APUE】进程间通信之共享存储(mmap函数)
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...
- hdu 4950 Monster(数学题,多校8)
题目链接:pid=4950http://acm.hdu.edu.cn/showproblem.php?pid=4950">http://acm.hdu.edu.cn/showprobl ...
- 杭电1232畅通project
畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- A Single Channel with Multiple Consumers RabbitMQ
http://stackoverflow.com/questions/30696351/a-single-channel-with-multiple-consumers-rabbitmq up vot ...
- Android中个人推崇的数据库使用方式
手机应用开发中常常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库.在上层进行了一层封装,同一时候还为我们提供了ContentProvider的框架.方便我们进 ...
- 【Jquery】jQuery获取URL參数的两种方法
jQuery获取URL參数的关键是获取到URL,然后对URL进行过滤处理,取出參数. location.href是取得URL.location.search是取得URL"?"之后的 ...
- A + B Problem II(杭电1002)
/*A + B Problem II Problem Description I have a very simple problem for you. Given two integers A an ...