BZOJ 2756 【SCOI2012】 奇怪的游戏
题目链接:奇怪的游戏
一开始这道题想岔了……想到黑白染色后对总格子数按奇偶性分类讨论,然后没发现奇数个格子的可以直接解方程……
首先可以发现每次操作是给相邻的两个格子权值加一,因此我们把棋盘黑白染色后每次操作就是给白格子和黑格子加一。因此白格子和黑格子的增加的量是相等的。设我们有\(n_1\)个白格子,它们的数值和是\(s_1\),有\(n_2\)个黑格子,数值和是\(s_2\)。再设最后每个数都变成了\(x\),那么有:
\[n_1x-s_1=n_2x-s_2\]
所以当\(n_1 \neq n_2\)时就可以直接解出\(x\)了。然后跑遍最大流检验一下这个\(x\)是否合法即可。
然后当\(n_1 = n_2\)时,如果\(s_1 \neq s_2\),那么显然无解。否则的话,我们可以发现答案是可以二分的。若\(x\)是一个合法的答案,因为共有偶数个格子,那么行数和列数至少有一个是偶数,我们就有一种方案把每个位置上的权值都加上一,使答案变成\(x+1\)。所以,二分一个答案,最大流\(check\)即可。
下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1610
#define maxm 10000
#define INF (1ll<<60) using namespace std;
typedef long long llg; int Q,n,m,a[41][41],S,T,n1,n2,_m;
int zx[4]={0,0,1,-1},zy[4]={1,-1,0,0};
int head[maxn],next[maxm],to[maxm],tt;
llg s1,s2,c[maxm]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void link(int x,int y){
to[++tt]=y;next[tt]=head[x];head[x]=tt;
to[++tt]=x;next[tt]=head[y];head[y]=tt;
} int d[maxn],rd,ld,dep[maxn];
bool bfs(){
for(int i=1;i<=T;i++) dep[i]=-1;
ld=rd=0; d[rd++]=S; dep[S]=1;
while(ld!=rd){
int u=d[ld++];
for(int i=head[u],v;v=to[i],i;i=next[i])
if(c[i] && dep[v]==-1) dep[v]=dep[u]+1,d[rd++]=v;
}
return dep[T]!=-1;
} llg dfs(int u,llg now){
if(!now) return 0;
if(u==T) return now;
llg low=0,res;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(c[i] && dep[v]==dep[u]+1){
res=dfs(v,min(now,c[i])); low+=res;
c[i]-=res; c[i^1]+=res; now-=res;
}
if(!low) dep[u]=-1;
return low;
} bool cheadck(llg x){
int next=2; llg ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++,next+=2){
if(a[i][j]>x) return 0;
c[next]=x-a[i][j],c[next^1]=0;
}
while(next<=tt) c[next]=INF,c[next^1]=0,next+=2;
while(bfs()) ans+=dfs(S,INF);
return ans>=1ll*x*n1-s1;
} void lian(int u,int x,int y){
for(int k=0,i,j;k<4;k++){
i=x+zx[k],j=y+zy[k];
if(i>0 && i<=n && j>0 && j<=m)
link(u,(i-1)*m+j);
}
} int main(){
File("a");
Q=getint();
while(Q--){
n=getint(); m=getint(); _m=n1=n2=0;
S=n*m+1; T=S+1; tt=1; s1=s2=0;
for(int i=1,now=1;i<=n;i++)
for(int j=1;j<=m;j++,now++){
_m=max(_m,a[i][j]=getint());
if((i+j)&1) link(S,now),s1+=a[i][j],n1++;
else link(now,T),s2+=a[i][j],n2++;
}
for(int i=1,now=1;i<=n;i++)
for(int j=1;j<=m;j++,now++)
if((i+j)&1) lian(now,i,j);
if(n1!=n2){
llg x=(s1-s2)/(n1-n2);
if(cheadck(x)) printf("%lld\n",n1*x-s1);
else printf("-1\n");
}
else if(s1!=s2) printf("-1\n");
else{
llg l=_m,r=s1+s2,mid;
while(l!=r){
mid=(l+r)>>1;
if(cheadck(mid)) r=mid;
else l=mid+1;
}
printf("%lld\n",l*n1-s1);
}
for(int i=1;i<=T;i++) head[i]=0;
}
return 0;
}
BZOJ 2756 【SCOI2012】 奇怪的游戏的更多相关文章
- 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]奇怪的游戏 二分+网络流
2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4926 Solved: 1362[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]奇怪的游戏(二分 黑白染色 最大流ISAP)
题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...
- bzoj 2756 [SCOI2012]奇怪的游戏【二分+最大流】
达成成就:为二分调参 !:多次memset的话要把数组大小开严格一点,否则会T 看到网格图,首先黑白染色. 注意到每次操作都是在一个黑格子和一个白格子上进行的,也就是说,最后黑格子数字和白格子数字和的 ...
- Bzoj2756 [SCOI2012]奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3220 Solved: 886 Description ...
- bzoj2756: [SCOI2012]奇怪的游戏(网络流+分情况)
2756: [SCOI2012]奇怪的游戏 题目:传送门 题解: 发现做不出来的大难题一点一个网络流 %大佬 首先黑白染色(原来是套路...)染色之后就可以保证每次操作都一定会使黑白各一个各自的值加1 ...
- [题目] Luogu P5038 [SCOI2012]奇怪的游戏
学习资料 -----1----- -----2----- P5038 [SCOI2012]奇怪的游戏 一道甚神但没用到高深模型的题 思路 没思路,看题解吧 代码 #include <iostre ...
随机推荐
- EUI List列表实现人物列表 (List的Item复用,Item获取)
一 Scroll+List ,拖动组件到exml. List不能写定高度,不然无法自动扩展. 二 新建List条目皮肤, ListItemSkin皮肤 条目皮肤下有:一个红色背景Rect,头像Im ...
- mysql字符串根据指定字符分割
1.分割函数:SUBSTRING_INDEX('浙江温州-中国电信','-','1') 2.用例(筛选'-'前至少4个汉字的数据) a.数据分布 b.筛选sql select t.mobile_num ...
- 性能分析工具gprof介绍(转载)
性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...
- 使用colmap进行稠密重建
colmap应该是目前state-of-art的增量式SFM方案,可以方便的对一系列二维图片进行三维重建 不用对摄像机进行标定,只需要从不同角度对重建场景或物体进行拍摄得到一系列图像作为输入 首先需要 ...
- Android复习
第一章 1.Android系统架构:(四层) Linux内核层:为安卓设备的各种硬件提供底层的驱动. 系统运行库层:为Android系统提供主要的特性支持. 应用框架层:提供了构建应用程序可能用到的各 ...
- 服务器和客户端的交互方式(Socket,http协议)和各自特点适用范围
1 数据传输方式 1.1 Socket传输的定义和其特点 所谓socket通常也称作"套接字",实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议.S ...
- boost.sha1
#include <boost/uuid/sha1.hpp> #include <iostream> /* @brief SHA1摘要算法:一种很重要的密码学算法,可将任意长度 ...
- Mysql中datetime和timestamp区别
DATETIME日期和时间的组合.支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'.MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DA ...
- mysql 约束条件 auto_increment 自动增长起始值 布长 起始偏移量
我们指定一个字段为自动增长,他默认从1开始自动增长,默认值为1,每次增长为1,步长为1 模糊查询 like % 代表任意个数字符 任意字符长度 查看mysql正在使用变量 show variables ...
- SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行(转)
我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlSe ...