对棋盘黑白染色后,若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. openssl 生成证书上 grpc 报 legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

    最近用传统的方式 生成的证书上用golang 1.15. 版本 报 grpc 上面 ➜ ~ go version go version go1.15.3 darwin/amd64 上面调用的时候报错了 ...

  2. 洛谷3119 草鉴定(tarjan)

    题目大意 约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从\(1\)号草场出发,最后回到\(1 ...

  3. 后缀自动机(SAM)奶妈式教程

    后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...

  4. GPIO位带操作点亮LED,且使用按键控制开关

    1. 项目 类似与C51单片机的位操作使能引脚来点亮LED. 例如,sbit P0^0 = 0 LED1 = P0^0; 2. 代码 main.c #include "stm32f10x.h ...

  5. shell关键字含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  6. Java:并发笔记-03

    Java:并发笔记-03 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-2 本章内容-2 Monitor wait/notify 3.6 ...

  7. 欧姆龙plc通讯协议格式

    欧姆龙CPM1A型plc与上位计算机通信的顺序是上位机先发出命令信息给PLC,PLC返回响应信息给上位 机.每次通信发送/接受的一组数据称为一"帧".帧由少于131个字符的数据构成 ...

  8. BUAA-软件工程-个人总结与心得

    提问回顾以及个人总结 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 学习软件开发的过程,团队之间的写作 ...

  9. 21.6.25 test

    \(NOI\) 模拟赛 \(T1\) 是树+位运算+dp+优化 打了 \(O(n^2)\) 的暴力dp,只拿到了35分,算了一下参赛的,人均65,中位数60.也能看出一些问题,对于一些模糊的猜测应该尝 ...

  10. advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)

    <高级Bash脚本编程指南>Revision 10中文版 github上链接地址: https://github.com/LinuxStory/Advanced-Bash-Scriptin ...