对棋盘黑白染色后,若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. uoj279题目交流通道(dp)

    题目大意: 神犇星球有 \(n\) 座小城.对于任意两座小城 \(v,u\)\((v≠u)\),吉米多出题斯基想在 \(v,u\) 之间建立一个传送时间为 \(w(v,u)\)的无向传送通道,其中 \ ...

  2. 魔改swagger:knife4j的另外一种打开方式

    之前公司使用了swagger作为文档管理工具,原生的swagger-ui非常丑,之后就用了开源项目 萧明 / knife4j 的swagger组件进行了swagger渲染,改造之后界面漂亮多了,操作也 ...

  3. 在IDEA中创建SpringBoot项目01

    1.选择创建项目 2.填写项目信息 3. 4. 5.Finish后会下载,之后生成目录结构: 6.在自己的包目录结构下添加了Controllr和Entiy测试项目: Controller: 1 pac ...

  4. Shell 编程 基础用法

    Shell 编程 更改shell脚本权限 chmod u+x shell.sh 标准头部写法 #! /bin/bash #! /bin/dash 变量使用 a=10 print $a 读取命令行参数 ...

  5. FastAPI 学习之路(十五)响应状态码

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  6. C++编译Dlib库出现LNK2001错误(原因是在Python中安装过Dlib)

    问题 使用CMake编译Dlib库,编译得到lib文件后,新建一个VS工程想使用Dlib,却出现LNK2001:无法解析的外部符号的错误,且都与JPEG和PNG相关: 1>dlib19.17.9 ...

  7. MySQL:提高笔记-3

    MySQL:提高笔记-3 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3,本文 说明:这是根据 bilibi ...

  8. Noip模拟41 2021.8.16

    T1 你相信引力吗 对于区间的大小关系问题,往往使用单调栈来解决 这道题的优弧和劣弧很烦,考虑将其等价的转化 由于所有的合法情况绕过的弧都不会经过最高的冰锥, 又因为环可以任意亲定起点,这样可以直接把 ...

  9. 第33篇-方法调用指令之invokeinterface

    invokevirtual字节码指令的模板定义如下: def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invoke ...

  10. 实验 1: SDN拓扑实践

    (图片和文档是自己写的,因为在CSDN也写了,所以会有自己的水印) 一.实验目的 能够使用源码安装Mininet: 能够使用Mininet的可视化工具生成拓扑: 能够使用Mininet的命令行生成特定 ...