[bzoj2756]奇怪的游戏
对棋盘黑白染色后,若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]奇怪的游戏的更多相关文章
- BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...
- 【bzoj2756 奇怪的游戏】
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4403 Solved: 1226[Submit][Status][Discuss] Descript ...
- 【BZOJ2756】奇怪的游戏(二分,最小割)
题意: Blinker最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blinker 想知道最 ...
- 【BZOJ2756】奇怪的游戏(二分,网络流)
[BZOJ2756]奇怪的游戏(二分,网络流) 题面 BZOJ Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blink ...
- 【BZOJ-2756】奇怪的游戏 最大流 + 分类讨论 + 二分
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2925 Solved: 792[Submit][Stat ...
- Bzoj2756 [SCOI2012]奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3220 Solved: 886 Description ...
- BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- BZOJ2756 [SCOI2012]奇怪的游戏 【网络流 + 二分】
题目 Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 Blinker 想知 ...
- bzoj2756: [SCOI2012]奇怪的游戏(网络流+分情况)
2756: [SCOI2012]奇怪的游戏 题目:传送门 题解: 发现做不出来的大难题一点一个网络流 %大佬 首先黑白染色(原来是套路...)染色之后就可以保证每次操作都一定会使黑白各一个各自的值加1 ...
随机推荐
- 微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台
作者 | Frank San Miguel 策划 | 田晓旭 2021 年,Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台.Cosmos 是一个计算平台,它将微服 ...
- Serverless 架构下的服务优雅下线实践
作者 | 行松 阿里巴巴云原生团队 应用发布.服务升级一直是一个让开发和运维同学既兴奋又担心的事情. 兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值:担心的是上线的过程会不会出现意外情 ...
- 洛谷3233 HNOI2014(虚树+dp)
膜拜一发\(mts\_246,forever\_shi\) 这两位爷是真的无敌! 首先来看这个题,一看题目的数据范围和"关键点"字眼,我们就能得知这是一道虚树题 那就先一如既往的建 ...
- Markdown数学公式
1. 显示位置与大小 正文(inline)中的LaTeX公式用$...$定义, 显示在当前行内. $\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$ \(\sum_{i ...
- 内网渗透DC-5靶场通关
个人博客地址:点我 DC系列共9个靶场,本次来试玩一下一个 DC-5,只有一个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶 ...
- Kali Linux修改root密码
今天在官网下载了一个Kali虚拟机的压缩包, 解压缩后直接在VM中打开,点了好多次打开发现都打不开,查了一下说是没有关闭共享虚拟机,于是操作了一番: 编辑→首选项→共享虚拟机→选择禁用. 操作完之后果 ...
- 【二食堂】Beta - Scrum Meeting 8
Scrum Meeting 8 例会时间:5.22 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. UI优化已经完成,顺带修复了一点小bug.issue 1. 文本导入.保存部 ...
- 替换excel模板中的内容并使用JavaMail发送邮件
由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容.而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的. 而我的电脑刚打开excel有点卡,因此决定使用Java ...
- pyqgis环境配置
配置pyqgis开发环境时,很多网上教程写的非常繁琐,这里仅仅找了一个最简单的配置方法,使用pycharm的IDE,安装QGIS软件后,在pycharm的ProjectInterpreter里面填写Q ...
- C语言链表实例--玩转链表
下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...