bzoj 2756奇怪的游戲

2756: [SCOI2012]奇怪的游戲

Time Limit:?40 Sec??Memory Limit:?128 MB
Submit:?2571??Solved:?685
[Submit][Status][Discuss]

Description

Blinker最近喜歡上一個奇怪的游戲。?
這個游戲在一個 N*M 的棋盤上玩,每個格子有一個數。每次 Blinker 會選擇兩個相鄰
的格子,并使這兩個數都加上 1。?
現在 Blinker 想知道最少多少次能使棋盤上的數都變成同一個數,如果永遠不能變成同
一個數則輸出-1。?

Input

輸入的第一行是一個整數T,表示輸入數據有T輪游戲組成。?
每輪游戲的第一行有兩個整數N和M, 分別代表棋盤的行數和列數。?
接下來有N行,每行 M個數。?

Output


? 對于每個游戲輸出最少能使游戲結束的次數,如果永遠不能變成同一個數則輸出-1。

Sample Input

2
2 2
1 2
2 3
3 3
1 2 3
2 3 4
4 3 2

Sample Output

2
-1

HINT

?

【數據范圍】?

??? 對于30%的數據,保證? T<=10,1<=N,M<=8?

對于100%的數據,保證? T<=10,1<=N,M<=40,所有數為正整數且小于1000000000?

?

考慮末狀態有所有數都相等的很好性質,所以設所有數的變為x。因為每次只會對相鄰兩個格子加1,所以奇偶分治后,兩種格子的變化量相同。

所以可以列出方程

這里借用黃學長的博客

對棋盤進行黑白染色
設黑格個數為num1 數值和為sum1
設白格個數為num1 數值和為sum1

設最后都變為x

num1 * x – sum1 = num2 * x – sum2
x = (sum1 – sum2) / (num1 – num2)

?

然后分類討論

當num1 ≠ num2時 可以解出 x 再用網絡流check即可

對于num1 = num2時 可以發現 對于一個合法的x k>=x都是一個合法的解
因為num1 = num2 =>?(num1 + num2) % 2 == 0 可以構造一層的滿覆蓋
所以可以二分x 然后用網絡流check

建圖:
如果點k為白
建邊(s,?k, x – v[k])
如果為黑
建邊(k, t, x – v[k])
對相鄰點u、v?(u為白)
建邊 (u,?v, inf)

?

方法:利用末狀態性質,設未知數,列出方程。然后分類討論,首先要滿足方程才有解,然后可以二分答案,在check。其實如果都合法,可以直接二分末狀態,然后check。方程討論是因為解得情況在不同條件下不同。

?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 2020
#define maxm 8020
#define INF 100000000000000lltypedef long long LL;
struct node{int next,to;LL f;
}e[maxm * 2];
int head[maxn],cnt = 1,src,sink;
int q[maxn],hh,tt,dis[maxn],cur[maxn];
int n,m,T,num1,num2,mx;
LL sum1,sum2,maxflow,x,ans;
int dt[maxn][maxn];inline void adde(int x,int y,LL c){e[++cnt].to = y;e[cnt].next = head[x];e[cnt].f = c;head[x] = cnt;e[++cnt].to = x;e[cnt].next = head[y];head[y] = cnt;
}
inline bool bfs(){tt = hh = 0;memset(dis,0,sizeof(dis));q[tt++] = src , dis[src] = 1;while ( hh < tt ){int now = q[hh++];for (int i = head[now] ; i ; i = e[i].next){if ( e[i].f && !dis[e[i].to] ){q[tt++] = e[i].to;dis[e[i].to] = dis[now] + 1;}}}return dis[sink] > 0;
}
LL dfs(int now,LL delta){if ( now == sink || !delta ) return delta;LL ret = 0;for (int &i = cur[now] ; i ; i = e[i].next){if ( e[i].f && dis[now] + 1 == dis[e[i].to] ){LL d = dfs(e[i].to,min(delta,e[i].f));ret += d , delta -= d;e[i].f -= d, e[i ^ 1].f += d;if ( !delta ) return ret;}}if ( delta ) dis[now] = -1;return ret;
} 
inline LL dinic(){LL flow = 0;while ( bfs() ){for (int i = 1 ; i <= sink ; i++) cur[i] = head[i];flow += dfs(src,INF);}return flow;
}
inline void init(LL x){memset(head,0,sizeof(head));memset(e,0,sizeof(e));cnt = 1;for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= m ; j++){if ( (i + j) & 1 ){adde((i - 1) * m + j,sink,x - (LL)dt[i][j]);}else{int now = (i - 1) * m + j;adde(src,(i - 1) * m + j,x - (LL)dt[i][j]);if ( i > 1 ) adde(now,now - m,INF);if ( i < n ) adde(now,now + m,INF);if ( j > 1 ) adde(now,now - 1,INF);if ( j < m ) adde(now,now + 1,INF);}}}
}
int main(){freopen("input.txt","r",stdin);scanf("%d",&T);while ( T-- ){ans = sum1 = sum2 = 0 , mx = num1 = num2 = 0;scanf("%d %d",&n,&m);src = n * m + 1 , sink = n * m + 2;for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= m ; j++){scanf("%d",&dt[i][j]);if ( (i + j) & 1 ) sum2 += (LL)dt[i][j] , num2++;else sum1 += (LL)dt[i][j], num1++;mx = max(dt[i][j],mx);}}if ( num1 != num2 ){if ( ((sum1 - sum2) % (LL)(num1 - num2)) != 0 ){printf("-1\n");continue;}	x = (sum1 - sum2) / (LL)(num1 - num2);if ( x < mx ){printf("-1\n");continue;}init(x);maxflow = dinic();if ( maxflow + sum1 == (LL)num1 * x ){printf("%lld\n",maxflow);}else printf("-1\n");}else{LL l = mx , r = INF;//二分把當前的每個數都變成mid的情況for (int i = 1 ; i <= 50 ; i++){maxflow = 0;LL mid = (l + r) >> 1;init(mid);maxflow = dinic();if ( maxflow + sum1 == (LL) num1 * mid ){ans = maxflow , r = mid;}else l = mid + 1;}if ( !ans ) printf("-1\n");else printf("%lld\n",ans);}}return 0;
}

轉載于:https://www.cnblogs.com/zqq123/p/5263783.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

秒懂,Java 注解 (Annotation)你可以這樣學

轉自: https://blog.csdn.net/briblue/article/details/73824058 文章開頭先引入一處圖片。 這處圖片引自老羅的博客。為了避免不必要的麻煩&#xff0c;首先聲明我個人比較尊敬老羅的。至于為什么放這張圖&#xff0c;自然是為本篇博文服務&#xff0c;接下來我自會說明。好了…

Java技術中的三大特性

為什么80%的碼農都做不了架構師&#xff1f;>>> 1&#xff0e;虛擬機 Java虛擬機JVM&#xff08;Java Virtual Machine&#xff09;在Java編程里面具有非常重要的地位&#xff0c;約相當…

matlab圖像增強分段線性函數_圖像增強、銳化,利用 PythonOpenCV 來實現 4 種方法!...

圖像增強目的使得模糊圖片變得更加清晰、圖片模糊的原因是因為像素灰度差值變化不大&#xff0c;圖片各區域產生視覺效果似乎都是一樣的&#xff0c; 沒有較為突出的地方&#xff0c;看起來不清晰的感覺解決這個問題的最直接簡單辦法&#xff0c;放大像素灰度值差值、使圖像中的…

python多人聊天室_Python基于Socket實現簡易多人聊天室

前言套接字(Sockets)是雙向通信信道的端點。 套接字可以在一個進程內&#xff0c;在同一機器上的進程之間&#xff0c;或者在不同主機的進程之間進行通信&#xff0c;主機可以是任何一臺有連接互聯網的機器。套接字可以通過多種不同的通道類型實現&#xff1a;Unix域套接字&…

計算機考研保護一志愿,考研良心大學,保護一志愿的考研名校!

大家好&#xff0c;我是&#xff0c;今天胖胖要跟大家送一些重要的干貨&#xff0c;就是對于選學校的小伙伴來說也好&#xff0c;或者是即將要參加研究生復試的小伙伴們來好胖胖在這里要跟大家說一個關于考研白名單的事情&#xff0c;因為大家都知道考研是會分黑名單和白名單&a…

python變量輸出到文件_使用函數將多個變量寫入文件

首先&#xff0c;要獲得當前正在執行的腳本名&#xff0c;或者更確切地說是調用函數的模塊&#xff0c;必須從堆棧跟蹤中獲取它。globals()-它將在writeToValues()函數的相同上下文中執行&#xff0c;因此它不會從“調用者”接收globals()。要糾正這種情況&#xff0c;您可以使…

嵌入式linux系統移植的四大步驟_嵌入式系統移植步驟

在嵌入式系統移植中重要的一部分是操作系統的移植&#xff0c;與其它操作系統相比&#xff0c;Linux大的特點&#xff1a;它是一款遵循GPL的操作系統&#xff0c;我們可以自由地使用、修改、和擴展它。正是由于這一特色&#xff0c;嵌入式系統移植過程中Linux系統受到越來越多人…

sdn框架的計算機網絡管理,清華SDN實踐--SDN 系統架構與數據中心應用

清華大學在SDN 的系統架構以及其在數據中心網絡中的應用方面展開了深入研究&#xff0c;主要研究成果包括&#xff1a;1. 以數據為中心的軟件定義網絡架構 SODA(Software Defined Data Centric Networking)。與 OpenFlow 相比&#xff0c;SODA 大大增強了數據層面的處理能力&am…

《軟件工程》課之-調查問卷的心得體會

1.這次調查是艱辛的。 2.很多人都誤以為我在發小廣告。。 3.很多人都不認識俄羅斯方塊1010這個游戲。 4.大家對于游戲的見解千奇百怪。 5.題目出的不是很完美&#xff0c;下次改進。。 6.簡單分析下結果&#xff0c;男孩子都喜歡多人的游戲&#xff0c;女孩的喜歡的多種多樣&am…

python循環語句for求和_for循環簡介

## for循環簡介for循環可以用來遍歷某一對象(遍歷&#xff1a;通俗點說&#xff0c;就是把這個循環中的第一個元素到最后一個元素依次訪問一次)。for循環的基本結構如下&#xff1a;![](https://img.kancloud.cn/75/33/753371a9536ed9eeb159074482ec85f0_558x174.png)說明&…

華為備份歷史版本_華為手機NAS備份時提示“需處于同一局域網”的解決方法

本內容來源于什么值得買APP&#xff0c;觀點僅代表作者本人 &#xff5c;作者&#xff1a;噩夢飄雷創作立場聲明&#xff1a;在使用華為手機向群暉NAS中備份時發現一直無法成功&#xff0c;經過一番研究找到了解決方案&#xff0c;希望能幫到大家~前言最近看了一位老哥的帖子&a…

計算機系統集成難點,企業MES實施中存在的難點及建議

MES是企業生產管理服務的核心信息化系統。實施MES是為了將現代企業生產管理思想、理念引入企業生產管理&#xff0c;對企業生產管理流程進行重組和優化&#xff0c;促進企業生產管理水平的提高。可是作用如此大的MES系統在實施過程中能一路無阻嗎&#xff1f;MES系統的作用1.車…

【原創】自己編寫的JavaGUI一鍵生成(hibernate/spring/mvc/maven)工具(附帶視頻教程源碼)...

為什么80%的碼農都做不了架構師&#xff1f;>>> 帶項目源碼&#xff08;https://git.oschina.net/qsyan/GeneratorFx&#xff09; app下載地址(附帶視頻教程)&#xff1a;http://download.csdn.net/detail/juyan2008/9769406 注明&#xff1a;此應用采用javafx編寫…

2018-2019 20165203 《信息安全系統設計基礎》第一周學習總結

2018-2019-1 20165203 《信息安全系統設計基礎》第一周學習總結 教材學習內容總結 編譯&#xff1a;gcc [選項] [文件名]選項參數表 參數對應功能-E僅執行編譯預處理-S將.c代碼轉換為匯編語言代碼-c僅執行編譯操作&#xff0c;不進行連接操作-o指定生成的輸出文件-I (大寫)指定…

普通計算機怎么算根號_大學專業介紹 | 計算機專業的真實就業情況

前兩天給大家簡單介紹了近些年比較火的計算機類相關專業具體都有哪些不同&#xff0c;以及就業時的行業或者崗位的側重點。今天呢我們繼續這個話題&#xff0c;來聊一聊整個計算機相關專業在學習和就業過程中大概是什么樣子的&#xff0c;希望能夠給大家提供一些實實在在的參考…

設計模式總結篇系列:工廠方法模式(Factory Method)

工廠方法模式適合于對實現了同一接口或繼承了同一父類的一些類進行實例的創建。一般是通過定義一個工廠類&#xff0c;并在其方法中實現對具有上述特點的類對象的創建。 根據具體產生類對象的方法定義形式&#xff0c;又可以將其分為普通工廠方法模式、多個工廠方法模式和靜態工…

高新園區到大連計算機學校,大連高新區中心小學

大連市高新區中心小學簡介&#xff1a;大連市高新區中心小學始建于2009年9月&#xff0c;是大連高新技術產業園區籌建的第一所直屬公辦學校。學校現擁有2000多名學生&#xff0c;87名教職員工。學校確定了“辦詩韻教育&#xff0c;讓每個孩子都幸福的教育理念”&#xff0c;通過…

java基礎之匿名內部類

內部類:   概述: 類里邊還有一個類, 里邊那個類叫內部類, 外邊那個類叫外部類.   分類:  成員內部類: 定義在成員位置的內部類.  局部內部類: 定義在局部位置的內部類. 格式:   new 類名或者接口名(){     //重寫類或者接口中 所有的 抽象方法;   };本質:  就…

0限流電阻 stm32_上/下拉電阻

除了前一節討論的拉電阻基本使用方法外&#xff0c;上拉電阻也可以提升高電平的電壓閾值&#xff0c;以便于前后級信號相匹配&#xff0c;比如&#xff0c;TTL邏輯電平驅動CMOS邏輯電平時&#xff0c;我們通常會添加一個上拉電阻R1&#xff0c;如下圖所示&#xff1a;But Why&a…

天地與我并存/萬物與我為一 2

http://blog.sina.com.cn/s/blog_17e792e010102y4lu.html 庖丁解牛 先秦&#xff1a;莊周 吾生也有涯&#xff0c;而知也無涯 。以有涯隨無涯&#xff0c;殆已&#xff01;已而為知者&#xff0c;殆而已矣&#xff01;為善無近名&#xff0c;為惡無近刑。緣督以為經&#xff0c…