BZOJ1453: [Wc]Dface雙面棋盤

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 784 Solved: 422
[Submit][Status][Discuss]

Description

佳佳有一個 nnn 行 nnn 列的黑白棋盤,每個格子都有兩面,一面白色,一面黑色。佳佳把棋盤平放在桌子上,因此每個格子恰好一面朝上,如下圖所示:

QQ20180116200234.png

我們把每行從上到下編號為 111 ,222 ,333 ,……,nnn ,各列從左到右編號為 111 ,222 ,333 ,……,nnn ,則每個格子可以用棋盤坐標(x,y)(x, y)(x,y) 表示。在上圖中,有 888 個格子黑色朝上,另外 171717 個格子白色朝上。

如果兩個同色格子有一條公共邊,我們稱這兩個同色格子屬于同一個連通塊。上圖共有 555 個黑色連通塊和 333 個白色連通塊。

佳佳可以每分鐘將一個格子翻轉(即白色變成黑色,黑色變成白色),然后計算當前有多少個黑色連通塊和白色連通塊,你能算得更快嗎?

Input

輸入文件的第一行包含一個正整數 nnn ,為格子的邊長。以下 nnn 行每行 nnn 個整數,非 000 即 111 ,表示初始狀態。000 表示白色,111 表示黑色。下一行包含一個整數 mmm ,表示操作的數目。以下 mmm 行每行兩個整數 xxx , yyy (111 ≤ xxx , yyy ≤ nnn ),表示把坐標為(x,y)(x, y)(x,y) 的格子翻轉。

Output

輸出文件包含 mmm 行,每行對應一個操作。該行包括兩個整數 bbb , www ,表示黑色區域和白色區域數目。
【約定】

○1 ≤ n ≤ 200

○1 ≤ m ≤ 10,000

Sample Input

5
0 1 0 0 0
0 1 1 1 0
1 0 0 0 1
0 0 1 0 0
1 0 0 0 0
2
3 2
2 3

Sample Output

4 3
5 2

HINT

翻轉(3,2)(3, 2)(3,2) 之后,棋盤變為:

QQ20180116200629.png

有 444 個黑色區域和 333 個白色區域

翻轉(2,3)(2, 3)(2,3) 之后,棋盤變為:

QQ20180116200639.png

有 555 個黑色區域和 222 個白色區域

Source

鳴謝劉汝佳先生授權使用

題解

用線段樹維護行,并查集合并
線段樹每個節點維護區間[l,r]中,行l的并查集,行r的并查集,用于查詢l與r的聯通情況,維護[l,r]行的白色連通塊數和黑色連通塊數。維護并查集父節點個數。

合并即可。

注意,并查集維護的時候,其所指的父親不是這些格子自身,而是虛出來的節點。在兩個區間合并的時候,處理虛的節點的連通性,右區間虛節點編號要加上左區間虛的節點的個數,合并后的虛節點繼承回區間的左右并查集即可。離散化一下,不然可能會很大。。

推薦題解

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
inline int max(int a, int b){return a > b ? a : b;}
inline double max(double a, double b){return a - b > 0 ? a : b;}
inline int min(int a, int b){return a < b ? a : b;}
inline void swap(int &x, int &y){int tmp = x;x = y;y = tmp;}
inline void read(int &x)
{x = 0;char ch = getchar(), c = ch;while(ch < '0' || ch > '9') c = ch, ch = getchar();while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();if(c == '-') x = -x;
}
const int INF = 0x3f3f3f3f;
const int MAXN = 200 + 10;
int n, q, fa[MAXN << 2], g[MAXN][MAXN], vis[MAXN << 2];
int find(int x)
{return x == fa[x] ? x : fa[x] = find(fa[x]);
}
struct Node
{int cnt, fal[MAXN << 1], far[MAXN << 1], wsize, bsize, l, r;Node(){cnt = wsize = bsize = l = r = 0, memset(fa, 0, sizeof(fa)), memset(far, 0, sizeof(far));}
}node[MAXN << 2];void pushup(int o)
{int l = o << 1, r = o << 1 | 1;if(node[l].cnt == 0){node[o] = node[r];return;}if(node[r].cnt == 0){node[o] = node[l];return;}for(int i = node[l].cnt + node[r].cnt;i;-- i) fa[i] = i, vis[i] = 0;node[o].wsize = node[l].wsize + node[r].wsize;node[o].bsize = node[l].bsize + node[r].bsize;for(int i = 1;i <= n;++ i)if(g[node[l].r][i] == g[node[r].l][i]){int f1 = find(node[l].far[i]), f2 = find(node[r].fal[i] + node[l].cnt);if(f1 != f2){fa[f1] = f2;if(g[node[l].r][i]) -- node[o].bsize;else -- node[o].wsize;}}node[o].cnt = 0;for(int i = 1;i <= n;++ i){int f1 = find(node[l].fal[i]), f2 = find(node[r].far[i] + node[l].cnt);if(!vis[f1]) vis[f1] = ++ node[o].cnt;if(!vis[f2]) vis[f2] = ++ node[o].cnt;node[o].fal[i] = vis[f1], node[o].far[i] = vis[f2];}
}
void calc(int o)
{int wsize = 0, bsize = 0, pos = node[o].l, *fal = node[o].fal, *far = node[o].far;if(g[pos][1]) ++ bsize; else ++ wsize;fal[1] = far[1] = 1;for(int i = 2;i <= n;++ i){if(g[pos][i] != g[pos][i - 1])if(g[pos][i]) ++ bsize;else ++ wsize;fal[i] = far[i] = wsize + bsize;}node[o].cnt = wsize + bsize, node[o].wsize = wsize, node[o].bsize = bsize;
}
void build(int o = 1, int l = 1, int r = n)
{node[o].l = l, node[o].r = r;if(l == r){calc(o);return;}int mid = (l + r) >> 1;build(o << 1, l, mid);build(o << 1 | 1, mid + 1, r);pushup(o);
}
void modify(int p, int o = 1, int l = 1, int r = n)
{if(l == r){calc(o);return;}int mid = (l + r) >> 1;if(p <= mid) modify(p, o << 1, l, mid);else modify(p, o << 1 | 1, mid + 1, r);pushup(o);
}int main()
{read(n);for(register int i = 1;i <= n;++ i)for(register int j = 1;j <= n;++ j)read(g[i][j]);build();read(q);for(register int i = 1;i <= q;++ i){int tmp1, tmp2;read(tmp1), read(tmp2);g[tmp1][tmp2] ^= 1;modify(tmp1);printf("%d %d\n", node[1].bsize, node[1].wsize);}return 0;
}

轉載于:https://www.cnblogs.com/huibixiaoxing/p/8599072.html

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

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

相關文章

用戶體驗數據分析 書單_如何使用數據改善用戶體驗設計

用戶體驗數據分析 書單In the current age of technology, if an entrepreneur comes up with a grand idea, chances are they’ll need a pretty sweet website to go along with it. And if they want their idea to really sell, they will also need a website that reall…

推薦11個實用的JavaScript庫

2019獨角獸企業重金招聘Python工程師標準>>> JavaScript 仍然是 2018 年最受歡迎和使用最為廣泛的編程語言&#xff0c;因此 JavaScript 生態系統也會繼續發展壯大。 然而&#xff0c;JavaScript 的標準庫仍然繼續保持“短小精悍”的身材。為了填補標準庫功能方面的…

371. 兩整數之和

371. 兩整數之和 給你兩個整數 a 和 b &#xff0c;不使用 運算符 和 - ???????&#xff0c;計算并返回兩整數之和。 示例 1&#xff1a; 輸入&#xff1a;a 1, b 2 輸出&#xff1a;3 示例 2&#xff1a; 輸入&#xff1a;a 2, b 3 輸出&#xff1a;5 提示&a…

【福利】微信小程序精選Demo合集

小編最近在開發小程序&#xff0c;也讀到了不少優秀的小程序源碼&#xff0c;項目中有些需求可以直接從源碼里粘貼復制過來&#xff0c;雖然這樣做不利于自己獨立編寫代碼&#xff0c;但比較是給公司做項目啊&#xff0c;秉著效率第一的原則&#xff0c;簡直沒有什么比ctrlc,ct…

639. 解碼方法 II

639. 解碼方法 II 一條包含字母 A-Z 的消息通過以下的方式進行了編碼&#xff1a; A -> 1 B -> 2 ... Z -> 26要 解碼 一條已編碼的消息&#xff0c;所有的數字都必須分組&#xff0c;然后按原來的編碼方案反向映射回字母&#xff08;可能存在多種方式&#xff09;。…

[cpyhon源代碼]dict對象原理學習

Cpython 2.7 分支中&#xff0c;dict 對象的源代碼 lookdict 搜索算法 1 static PyDictEntry *2 lookdict(PyDictObject *mp, PyObject *key, register long hash)3 {4 register size_t i;5 register size_t perturb;6 register PyDictEntry *freeslot;7 regis…

熊貓數據集_熊貓邁向數據科學的第一步

熊貓數據集I started learning Data Science like everyone else by creating my first model using some machine learning technique. My first line of code was :通過使用某種機器學習技術創建我的第一個模型&#xff0c;我開始像其他所有人一樣學習數據科學。 我的第一行代…

SQLServer鎖的機制

SQLServer鎖的機制&#xff1a;共享鎖(S)排它鎖(X)更新鎖(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架構修改(Sch-M) 架構穩定性(Sch-S)大容量更新&#xff08;BU&#xff09;轉載于:https://www.cnblogs.com/yldIndex/p/8603902.html

你是否具有價值

一個有價值的人往往受歡迎的程度才會高。白天上午花了兩個多小時的時間幫前同事遠程解決了服務器部署時由于防火墻機制問題引起的系統功能失敗的問題。解決完這個問題之后&#xff0c;同事的心情很愉悅&#xff0c;其實我自己的心情也很愉悅&#xff0c;看來人都有幫助別人和被…

為什么選擇做班級管理系統_為什么即使在平衡的班級下準確性也很麻煩

為什么選擇做班級管理系統Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that m…

使用Chrome開發者工具調試Android端內網頁(微信,QQ,UC,App內嵌頁等)

使用Chrome開發者工具調試Android端內網頁(微信&#xff0c;QQ&#xff0c;UC&#xff0c;App內嵌頁等) 傳送門轉載于:https://www.cnblogs.com/momozjm/p/9389912.html

517. 超級洗衣機

517. 超級洗衣機 假設有 n 臺超級洗衣機放在同一排上。開始的時候&#xff0c;每臺洗衣機內可能有一定量的衣服&#xff0c;也可能是空的。 在每一步操作中&#xff0c;你可以選擇任意 m (1 < m < n) 臺洗衣機&#xff0c;與此同時將每臺洗衣機的一件衣服送到相鄰的一臺…

netflix的準實驗面臨的主要挑戰

重點 (Top highlight)Kamer Toker-Yildiz, Colin McFarland, Julia GlickKAMER Toker-耶爾德茲 &#xff0c; 科林麥克法蘭 &#xff0c; Julia格里克 At Netflix, when we can’t run A/B experiments we run quasi experiments! We run quasi experiments with various obje…

網站漏洞檢測針對區塊鏈網站安全分析

2019獨角獸企業重金招聘Python工程師標準>>> 目前移動互聯網中&#xff0c;區塊鏈的網站越來越多&#xff0c;在區塊鏈安全上&#xff0c;很多都存在著網站漏洞&#xff0c;區塊鏈的充值&#xff0c;會員賬號的存儲性XSS竊取漏洞&#xff0c;賬號安全&#xff0c;等…

223. 矩形面積

223. 矩形面積 給你 二維 平面上兩個 由直線構成的 矩形&#xff0c;請你計算并返回兩個矩形覆蓋的總面積。 每個矩形由其 左下 頂點和 右上 頂點坐標表示&#xff1a; 第一個矩形由其左下頂點 (ax1, ay1) 和右上頂點 (ax2, ay2) 定義。 第二個矩形由其左下頂點 (bx1, by1) …

微觀計量經濟學_微觀經濟學與數據科學

微觀計量經濟學什么是經濟學和微觀經濟學&#xff1f; (What are Economics and Microeconomics?) Economics is a social science concerned with the production, distribution, and consumption of goods and services. It studies how individuals, businesses, governmen…

NPM 重新回爐

官方教程傳送門( 英文 ) 本文主要是官方文章的精煉,適合想了解一些常用操作的同學們 NPM 是 基于node的一個包管理工具 , 安裝node環境時會自帶安裝NPM. NPM版本管理 查看現有版本 npm -v 安裝最新的穩定版本 npm install npmlatest -g 安裝最新的測試版本 npm install npmn…

1436. 旅行終點站

1436. 旅行終點站 給你一份旅游線路圖&#xff0c;該線路圖中的旅行線路用數組 paths 表示&#xff0c;其中 paths[i] [cityAi, cityBi] 表示該線路將會從 cityAi 直接前往 cityBi 。請你找出這次旅行的終點站&#xff0c;即沒有任何可以通往其他城市的線路的城市。 題目數據…

如何使用fio模擬線上環境

線上表現 這里我想通過fio來模擬線上的IO場景&#xff0c;那么如何模擬呢&#xff1f; 首先使用iostat看線上某個盤的 使用情況&#xff0c;這里我們需要關注的是 avgrq-sz, avgrq-qz. #iostat -dx 1 1000 /dev/sdk Device: rrqm/s wrqm/s r/s w/s rkB/s …

熊貓數據集_熊貓邁向數據科學的第二部分

熊貓數據集If you haven’t read the first article then it is advised that you go through that before continuing with this article. You can find that article here. So far we have learned how to access data in different ways. Now we will learn how to analyze …