[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 ...
随机推荐
- 题解 「THUPC 2017」小 L 的计算题 / Sum
题目传送门 题目大意 给出 \(a_{1,2,...,n}\),对于 \(\forall k\in [1,n]\) ,求出: \[\sum_{i=1}^{n}a_i^k \] \(n\le 2\tim ...
- 1. SSTI(模板注入)漏洞(入门篇)
好久没更新博客了,现在主要在作源码审计相关工作,在工作中也遇到了各种语言导致的一些SSTI,今天就来大概说一下SSTI模板注入这个老生常谈的漏洞 前言 模板引擎 模板引擎(这里特指用于Web开发的模板 ...
- ClickHouse 存算分离架构探索
背景 ClickHouse 作为开源 OLAP 引擎,因其出色的性能表现在大数据生态中得到了广泛的应用.区别于 Hadoop 生态组件通常依赖 HDFS 作为底层的数据存储,ClickHouse 使用 ...
- JavaScript兼容性汇总
一般兼容性问都体现到DOM和事件上 只聊ie6+版本浏览器,希望小伙伴们别纠结更低版本浏览器哈^_^ DOM 获取元素 document.getElementsByclassName 不兼容ie6 ...
- [Beta]the Agiles Scrum Meeting 4
会议时间:2020.5.15 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 增加教学计划面板,修复bug tq 实现查看.删除测试点功能 wjx 实现批量创建结对项目功能 ...
- 热身训练2 GCD
题目描述 简要题意: n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...
- 计算机网络之流量控制(停止-等待协议、滑动窗口、后退N帧协议GBN、选择重传协议SR)、滑动窗口、可靠传输机制
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104908762 学习课程:<2019王道考研计算机网络> 学习目的 ...
- Spring MVC:DispatchServlet类
Spring MVC架构 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中.传统的模型层被拆分为了业务层(Service)和数据访问层 ...
- 检查是否是BST 牛客网 程序员面试金典 C++ java Python
检查是否是BST 牛客网 程序员面试金典 C++ java Python 题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个boo ...
- virt-v2v命令将ESXI 虚机迁移到OpenStack中
一简介: virt-v2v是将外部的虚拟化平台上的虚拟机转化到可以运行的KVM平台上.它可以读取在VMware.Xen运行Hyper-V和其他虚拟机管理程序上的Windows和Linux的虚拟机,并将 ...