【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流
这道题提醒我,要有将棋盘黑白染色的意识,尤其是看到相邻格子这样的条件的时候,然后就是要用到与其有关的性质与特点以体现其作用,这道题就是用到了黑格子与白格子之间的关系进行的,其出发点是每次一定会给一个黑格子与一个白格子均加一,那么最后黑白格子所加量相同(最关键的地方)。
然后呢,还要观察,最终高度与行动次数一一对应,于是求解他们两个是等效的,然后发现如果最后高度确定,是很好验证是否可行的,就是方格下水道。进一步分析,当黑格与白格的数量不同那么最终高度一定,可以一下判解。当数量相同的时候关于最终高度是单调的,因为h可以,h+1也可以,所以这道题就这么解决了。
为什么我想不到啊(苣蒻++)。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define pos(a,b) (((a)-1)*m+(b))
typedef long long LL;
const int N=;
const int P=N*N;
const int E=P*;
const LL Inf=0x3f3f3f3f3f3f3f3fLL;
struct V{
int to,next;
LL f;
}c[E];
int head[P],t;
inline void add(int x,int y,LL z){
c[++t].to=y,c[t].next=head[x],head[x]=t,c[t].f=z;
}
inline void clear(){
memset(head,,sizeof(head)),t=;
}
int n,m;
int S,T;
int deep[P],q[P],front,back;
inline bool bfs(){
memset(deep,,sizeof(deep));
front=back=,q[back++]=S,deep[S]=;
while(front!=back){
int x=q[front++];
for(int i=head[x];i;i=c[i].next)
if(c[i].f&&deep[c[i].to]==){
deep[c[i].to]=deep[x]+;
if(c[i].to==T)return true;
q[back++]=c[i].to;
}
}return false;
}
inline LL dfs(int x,LL v){
if(x==T||v==)return v;
LL ret=;
for(int i=head[x];i;i=c[i].next)
if(c[i].f&&deep[c[i].to]==deep[x]+){
LL f=dfs(c[i].to,std::min(c[i].f,v));
ret+=f,v-=f,c[i].f-=f,c[i^].f+=f;
if(v==)break;
}
if(ret==)deep[x]=;
return ret;
}
int cnt[];
LL sum[];
int max,val[N][N];
inline LL dinic(){
LL ret=;
while(bfs())ret+=dfs(S,Inf);
return ret;
}
inline bool check(LL ans){
clear();LL ret=;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if((i+j)&){
if(i>)
add(pos(i,j),pos(i-,j),Inf),add(pos(i-,j),pos(i,j),);
if(j>)
add(pos(i,j),pos(i,j-),Inf),add(pos(i,j-),pos(i,j),);
if(i<n)
add(pos(i,j),pos(i+,j),Inf),add(pos(i+,j),pos(i,j),);
if(j<m)
add(pos(i,j),pos(i,j+),Inf),add(pos(i,j+),pos(i,j),);
add(S,pos(i,j),ans-val[i][j]),add(pos(i,j),S,);
ret+=ans-val[i][j];
}else
add(pos(i,j),T,ans-val[i][j]),add(T,pos(i,j),);
return ret==dinic();
}
inline void work1(){
if((sum[]-sum[])%(cnt[]-cnt[])!=){
puts("-1");return;
}
LL ans=(sum[]-sum[])/(cnt[]-cnt[]);
if(check(ans))
printf("%lld\n",(ans*n*m-(sum[]+sum[]))>>1LL);
else puts("-1");
}
inline void work2(){
if(sum[]!=sum[]){
puts("-1");return;
}
LL l=max,r=Inf/5000LL,mid,ans=;
while(l<=r){
mid=(l+r)>>;
if(check(mid))
ans=mid,r=mid-;
else
l=mid+;
}
if(ans==)puts("-1");
else printf("%lld\n",(ans*n*m-(sum[]+sum[]))>>1LL);
}
int main(){
int test;scanf("%d",&test);
while(test--){
scanf("%d%d",&n,&m);
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
max=,S=n*m+,T=n*m+;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
scanf("%d",&val[i][j]);
++cnt[(i+j)&],sum[(i+j)&]+=val[i][j];
max=std::max(max,val[i][j]);
}
if(cnt[]!=cnt[])work1();
else work2();
}return ;
}
【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流的更多相关文章
- bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流
2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4926 Solved: 1362[Submit][Stat ...
- BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)
题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1594 Solved: 396[Submit][Stat ...
- BZOJ 2756 SCOI2012 奇怪的游戏 最大流
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2756 Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N ...
- bzoj 2756: [SCOI2012]奇怪的游戏
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- bzoj 2756 [SCOI2012]奇怪的游戏【二分+最大流】
达成成就:为二分调参 !:多次memset的话要把数组大小开严格一点,否则会T 看到网格图,首先黑白染色. 注意到每次操作都是在一个黑格子和一个白格子上进行的,也就是说,最后黑格子数字和白格子数字和的 ...
- P5038 [SCOI2012]奇怪的游戏 二分+网络流
$ \color{#0066ff}{ 题目描述 }$ Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 \(N \times M\) 的棋盘上玩,每个格子有一个数.每次\(Blinker\)会 ...
- 洛谷$P5038\ [SCOI2012]$奇怪的游戏 二分+网络流
正解:二分+网络流 解题报告: 传送门$QwQ$ 这种什么,"同时增加",长得就挺网络流的$QwQ$?然后看到问至少加多少次,于是考虑加个二分呗?于是就大体确定了做题方向,用的网络 ...
随机推荐
- mysql根据二进制日志恢复数据/公司事故实战经验
根据二进制日志恢复 目的:恢复数据,根据二进制日志将数据恢复到今天任意时刻 增量恢复,回滚恢复 如果有备份好的数据,将备份好的数据导入新数据库时,会随着产生二进制日志 先准备一台初始化的数据库 mys ...
- ESP32 LyraT音频开发板试玩(一):搭建开发环境
我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 关于ESP32的开发环境搭建,官方有教程, ...
- Linux:如何获取打开文件和文件描述符数量
一.linux的文件描述符 文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符.文件描述符是一 ...
- centos下搭建svn服务器端/客户端
1.安装 yum install subversion httpd mod_dav_svn 2.创建仓库存储代码 mkdir /var/repos svnadmin create /var/repos ...
- 【廖雪峰老师python教程】day1
主要内容摘要 函数参数[个人感觉难度很大,却很重要,可以先大概记一记]不要用的太复杂.戳这儿温习 递归函数:使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出.重点:找到递归关系和终止条件 ...
- 【个人训练】(POJ1837)Balance
这几天抓住国庆的黄金时间(因为没有女朋友,天天刷题emmmm 其实还在肝少前还要捞秋刀鱼) ,重点攻克掉几个基本的地方:搜索.dp.图论.这几天的题目应该就是这些范围. 题意 原题的意思大概是这样的, ...
- 不得不服!Python速度虽然慢,但是它工作效率很高!
写在前面 让我们来讨论一个我最近一直在思考的问题:Python 的性能.顺便说一下,我是 Python 的忠实拥趸,我在各种情况下都会积极尝试使用 Python 来解决问题.大家对 Python 最大 ...
- 阿里云SLB漏选“健康检查正常的http状态码”导致url重定向失败问题处理
背景: 一客户将线下电商网站迁移到阿里云上,公网出口使用阿里云SLB,SLB后端实例为ECS(webserver)web服务使用nginx.后端APP服务器使用了tomcat:to ...
- Kindle 3(非常旧的版本) 隔一段时间自动重启问题
买了本新书后,kindle 3 自己没事就在那边重启,几分钟一次 查到解决方案1: https://answers.yahoo.com/question/index?qid=2014040815565 ...
- 第1讲——用C++写一个程序
一.学习新知识 在学习C++之前学过C语言了,一些基础的就不bb了,进入正题. 来几个小程序练练手: [程序1] #include <iostream> //头文件 using names ...