BZOJ 2756 奇怪的游戏(最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2756
题意:在一个 N*M 的棋盘上玩,每个格子有一个数。每次 选择两个相邻的格子,并使这两个数都加上 1。 问最少多少次能使棋盘上的数都变成同一个数,如果永远不能变成同一个数则输出-1。
思路:对棋盘进行黑白染色,则每次操作使得黑白两色的格子总和各增加1。设黑色总和s1,个数cnt1;白色总和s2,个数cnt2,设最后的数字为x,那么有:
x*cnt1-s1=x*cnt2-s2。
(1)若cnt1!=cnt2,那么x是唯一的,x=(s1-s2)/(cnt1-cnt2),只要判定这个x是否合法即可;
(2)若cnt1=cnt2,那么x是不唯一的,但是x是单调的,即若x可以,则x+1也可以,因为黑白可以两两配对后各增加1。因此可以二分x,判定是否可行。
现在就是给定x判定是否可行。原点向黑格子连边,白格子向汇点连边,权值都是x-格子的数字。相邻格子连边无穷。满流即可。
struct node { int v,next; i64 cap; }; node edges[N]; int head[N],e; void add(int u,int v,i64 cap) { edges[e].v=v; edges[e].cap=cap; edges[e].next=head[u]; head[u]=e++; } void Add(int u,int v,i64 cap) { add(u,v,cap); add(v,u,0); } int pre[N],h[N],num[N],cur[N]; i64 Maxflow(int s,int t,int n) { int i; for(i=0;i<=n;i++) h[i]=num[i]=0,cur[i]=head[i]; int u=s,v,x; i64 ans=0,Min; while(h[u]<n) { if(u==t) { Min=inf+1; for(i=s;i!=t;i=edges[cur[i]].v) { x=cur[i]; if(edges[x].cap<Min) Min=edges[x].cap,v=i; } ans+=Min; u=v; for(i=s;i!=t;i=edges[cur[i]].v) { x=cur[i]; edges[x].cap-=Min; edges[x^1].cap+=Min; } } for(i=cur[u];i!=-1;i=edges[i].next) { v=edges[i].v; if(edges[i].cap>0&&h[u]==h[v]+1) break; } if(i!=-1) { cur[u]=i; pre[edges[i].v]=u; u=edges[i].v; } else { if(--num[h[u]]==0) break; cur[u]=head[u]; x=n; for(i=head[u];i!=-1;i=edges[i].next) { if(edges[i].cap>0) x=min(x,h[edges[i].v]); } h[u]=x+1; num[x+1]++; if(u!=s) u=pre[u]; } } return ans; } i64 a[55][55]; int n,m,b[55][55],s,t; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int check(i64 p) { clr(head,-1); e=0; s=0; t=n*m+1; int i,j,k,x,y; i64 sum=0; FOR1(i,n) FOR1(j,m) { if(p<a[i][j]) return 0; if((i+j)&1) Add(s,b[i][j],p-a[i][j]),sum+=p-a[i][j]; else Add(b[i][j],t,p-a[i][j]); if((i+j)%2==0) continue; FOR0(k,4) { x=i+dx[k]; y=j+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m) { Add(b[i][j],b[x][y],inf); } } } return Maxflow(s,t,t+1)==sum; } i64 cal() { i64 s1=0,s2=0,cnt1=0,cnt2=0,Max=0,ans; int i,j,k=0; FOR1(i,n) FOR1(j,m) b[i][j]=++k; FOR1(i,n) FOR1(j,m) { upMax(Max,a[i][j]); if((i+j)%2==0) s1+=a[i][j],cnt1++; else s2+=a[i][j],cnt2++; } if(cnt1!=cnt2) { ans=(s1-s2)/(cnt1-cnt2); if(check(ans)) return ans*cnt1-s1; return -1; } if(s1!=s2) return -1; i64 low=Max,high=inf,mid; ans=-1; while(low<=high) { mid=(low+high)>>1; if(check(mid)) ans=mid,high=mid-1; else low=mid+1; } if(ans==-1) return -1; return ans*cnt1-s1; } int main() { rush() { RD(n,m); int i,j; FOR1(i,n) FOR1(j,m) RD(a[i][j]); PR(cal()); } }
BZOJ 2756 奇怪的游戏(最大流)的更多相关文章
- bzoj 2756奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Description Blinke 最近喜欢上一个奇怪的游戏. 这个游戏 ...
- [BZOJ 2756] 奇怪的游戏
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2756 Algorithm: 比较新颖的题目 首先发现是对矩阵中相邻两数进行操作 & ...
- BZOJ 2756 SCOI2012 奇怪的游戏 最大流
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2756 Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- 【BZOJ-2756】奇怪的游戏 最大流 + 分类讨论 + 二分
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2925 Solved: 792[Submit][Stat ...
- BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- BZOJ2756 [SCOI2012]奇怪的游戏 最大流
好久没有写博客了.不过这个博客也没有多少人看 最近在写网络流,为了加深理解,来写一两篇题解. 对整个棋盘进行黑白染色以后可以发现,一次操作就是让二分图的两个点的值分别 \(+1\). 这样,我们就可以 ...
- 【BZOJ】【2756】【SCOI2012】奇怪的游戏
网络流-最大流 这题……建模部分先略过 这道题是会卡时限的T_T俺的Dinic被卡了,在此放几篇很棒的讲网络流算法的文章,至于大家耳熟能详的论文就不放了…… http://www.cppblog.co ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1594 Solved: 396[Submit][Stat ...
随机推荐
- oracle的簇的管理
使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限) 1.修改簇属性 可以修改的簇属性包括: * PCTFREE.PCTUSED.INITRANS.MAXTRANS.STORA ...
- location.reload
location.reload()-----重新加载缓存页面 location.reload(true)------重新加载服务器页面
- 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数
目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...
- Loadrunner教程读后感-VuGen
一.loadrunner协议分析 协议确定方法 二.提交表单函数的区别 (1)web_sumit_form() (2)web_sumit_data() 三.web_url和web_link 四.VuG ...
- Content Delivery Network
Coding Standards & Best Practices 7 Reasons to use a Content Delivery Network CDN公共库汇总
- 对页面制定区域进行打印,以及打印不显示页脚URL的方法
第一种方式 - 此种方式简单易用,但不能进行页面设置,会在底部显示页面的URL地址. 打印命令:只需在页面上的按钮事件调用这段JS代码 javascript:window.print(); ===== ...
- 为ecshop红包增加”转赠”功能
ecshop促销中使用红包激励用户购物,要想炒热活动,红包就需要有物以稀为贵的感觉.有人求有人送,这样红包之间的转赠有助于拉动第二梯队的顾客.但是如果已经把红包添加到自己的账户了怎么办?如果ecsho ...
- Houdini Krakatoa Render Plugin
HDK真实个混蛋,都懒得写个解释.凭着函数英文意思猜测.. plugin sample video: 在极其残忍的开发环境,"Particle Voxel Render" 产生了( ...
- 如果在遨游浏览器里设置Bing(必应)搜索为默认搜索
今天刚装了遨游浏览器,发现搜索引擎列表里没有Bing(必应)搜索的选项,就自己DIY了下. 步骤: 1. 在遨游搜索引擎列表管理里,添加一个新的搜索引擎项: Name:填写上”Bing(必应)“ (这 ...
- Network Saboteur 分类: 搜索 POJ 2015-08-09 19:48 7人阅读 评论(0) 收藏
Network Saboteur Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10147 Accepted: 4849 Des ...