对棋盘黑白染色后,若n和m都是奇数(即白色和黑色点数不同),可以直接算得答案(根据白-黑不变);若n和m不都是奇数,二分答案(二分的上限要大一点,开$2^50$),最后都要用用网络流来判定。
考虑判定,将白色点放在左边,黑色点放在右边,源点流向白点的流量是白点与答案的差,黑点流向汇点的流量是黑点与答案的差,白点向每一个相邻的黑点流inf的边,判断是否满流即可。

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 #define ll long long
5 #define inf (1LL<<50)
6 struct ji{
7 int nex,to;
8 ll len;
9 }edge[N*5];
10 queue<int>q;
11 int E,T,t,n,m,a[51][51],id[51][51],head[N],work[N],d[N];
12 ll l,r,s1,s2,mid;
13 void add(int x,int y,ll z){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 edge[E].len=z;
17 head[x]=E++;
18 if (E&1)add(y,x,0);
19 }
20 bool bfs(){
21 q.push(0);
22 memset(d,-1,sizeof(d));
23 d[0]=0;
24 while (!q.empty()){
25 int k=q.front();
26 q.pop();
27 for(int i=head[k];i!=-1;i=edge[i].nex)
28 if ((edge[i].len)&&(d[edge[i].to]<0)){
29 d[edge[i].to]=d[k]+1;
30 q.push(edge[i].to);
31 }
32 }
33 return d[T]>=0;
34 }
35 ll dfs(int k,ll s){
36 if (k==T)return s;
37 ll p;
38 for(int i=work[k];i!=-1;i=edge[i].nex)
39 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){
40 p=dfs(edge[i].to,min(s,edge[i].len));
41 if (p){
42 edge[i].len-=p;
43 edge[i^1].len+=p;
44 work[k]=i;
45 return p;
46 }
47 }
48 work[k]=-1;
49 return 0;
50 }
51 ll dinic(){
52 ll k,ans=0;
53 while (bfs()){
54 memcpy(work,head,sizeof(head));
55 while (k=dfs(0,inf))ans+=k;
56 }
57 return ans;
58 }
59 bool pd(ll k){
60 memset(head,-1,sizeof(head));
61 E=0;
62 for(int i=1;i<=n;i++)
63 for(int j=1;j<=m;j++)
64 if ((i+j)&1){
65 add(0,id[i][j],k-a[i][j]);
66 if (i>1)add(id[i][j],id[i-1][j],inf);
67 if (j>1)add(id[i][j],id[i][j-1],inf);
68 if (i<n)add(id[i][j],id[i+1][j],inf);
69 if (j<m)add(id[i][j],id[i][j+1],inf);
70 }
71 else add(id[i][j],T,k-a[i][j]);
72 return dinic()==k*(n*m/2)-s1;
73 }
74 int main(){
75 scanf("%d",&t);
76 while (t--){
77 scanf("%d%d",&n,&m);
78 for(int i=1;i<=n;i++)
79 for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
80 for(int i=1;i<=n;i++)
81 for(int j=1;j<=m;j++)id[i][j]=(i-1)*m+j;
82 T=id[n][m]+1;
83 s1=s2=l=0;
84 for(int i=1;i<=n;i++)
85 for(int j=1;j<=m;j++){
86 l=max(l,1LL*a[i][j]);
87 if ((i+j)&1)s1+=a[i][j];
88 else s2+=a[i][j];
89 }
90 if ((n&1)&&(m&1)){
91 if ((s2-s1<l)||(!pd(s2-s1)))printf("-1\n");
92 else printf("%lld\n",(s2-s1)*(n*m/2)-s1);
93 continue;
94 }
95 if (s1!=s2){
96 printf("-1\n");
97 continue;
98 }
99 r=inf;
100 while (l<r){
101 mid=(l+r>>1);
102 if (pd(mid))r=mid;
103 else l=mid+1;
104 }
105 if (!pd(l))printf("-1\n");
106 else printf("%lld\n",l*n*m/2-s1);
107 }
108 }

[bzoj2756]奇怪的游戏的更多相关文章

  1. BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论

    这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...

  2. 【bzoj2756 奇怪的游戏】

    Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4403  Solved: 1226[Submit][Status][Discuss] Descript ...

  3. 【BZOJ2756】奇怪的游戏(二分,最小割)

    题意: Blinker最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blinker 想知道最 ...

  4. 【BZOJ2756】奇怪的游戏(二分,网络流)

    [BZOJ2756]奇怪的游戏(二分,网络流) 题面 BZOJ Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blink ...

  5. 【BZOJ-2756】奇怪的游戏 最大流 + 分类讨论 + 二分

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2925  Solved: 792[Submit][Stat ...

  6. Bzoj2756 [SCOI2012]奇怪的游戏

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3220  Solved: 886 Description ...

  7. BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)

    Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...

  8. BZOJ2756 [SCOI2012]奇怪的游戏 【网络流 + 二分】

    题目 Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 Blinker 想知 ...

  9. bzoj2756: [SCOI2012]奇怪的游戏(网络流+分情况)

    2756: [SCOI2012]奇怪的游戏 题目:传送门 题解: 发现做不出来的大难题一点一个网络流 %大佬 首先黑白染色(原来是套路...)染色之后就可以保证每次操作都一定会使黑白各一个各自的值加1 ...

随机推荐

  1. 题解 51nod 1597 有限背包计数问题

    题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \( ...

  2. win 常用修复蓝屏,系统比对最后更新20210804

    您可以尝试以下方案: 在管理员命令提示符下键入以下命令:Dism /Online /Cleanup-Image /ScanHealth这条命令将扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一 ...

  3. Scrum Meeting 11

    第11次例会报告 日期:2021年06月01日 会议主要内容概述: 汇报了进度,开始爆肝. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下记录仅为保证公开性: ...

  4. 第32篇-解析interfacevirtual字节码指令

    在前面介绍invokevirtual指令时,如果判断出ConstantPoolCacheEntry中的_indices字段的_f2属性的值为空,则认为调用的目标方法没有连接,也就是没有向Constan ...

  5. MyBatis源码分析(三):MyBatis初始化(配置文件读取和解析)

    一. 介绍MyBatis初始化过程 项目是简单的Mybatis应用,编写SQL Mapper,还有编写的SqlSessionFactoryUtil里面用了Mybatis的IO包里面的Resources ...

  6. Codeforces Round #744 (Div. 3) G题题解

    淦,最后一道题没写出来,...还是我太菜了,不过这个题确实比较有趣. G. Minimal Coverage 简化题意:就是你处在坐标轴的0点上,给你一个序列\(a_i\),每次你可以选择向左走\(a ...

  7. hdu 5166 Missing number(。。。)

    题意: 有一个排列,但少了两个数.给你少了这两个数的排列.找出是哪两个数. 思路: 看代码,,, 代码: int a[1005]; int main(){ int T; cin>>T; w ...

  8. hdu 5102 The K-th Distance (队列+生成法,,)

    题意: N个点的一棵树.定义点u和点v的距离等于它们之间的路径(唯一的)的长度.这样我们可以得到n*(n-1)/2个距离. 将它们从小到大排序,问前K个数的和是多少. 思路: 将边长为1的树枝都入队列 ...

  9. 让Visual Studio x64 支持 __asm内联汇编

    目录 让Visual Studio x64 支持 __asm内联汇编 Intel Parallel Studio XE 2016安装 设置Interl C++ Compiler 使VS x64支持内联 ...

  10. 『动善时』JMeter基础 — 56、JMeter使用命令行模式生成HTML测试报告

    目录 1.自动生成HTML图形化报告 2.使用已有的测试结果文件生成HTML报告 3.HTML图形化报告内容详解 (1)Dashboard页面:(重点查看) (2)Charts页面:(辅助分析) 4. ...