UVA1493 - Draw a Mess(并查集)

UVA1493 - Draw a Mess(并查集)

題目鏈接

題目大意:一個N * M 的矩陣,每次你在上面將某個范圍上色,不論上面有什么顏色都會被最新的顏色覆蓋,顏色是1-9,初始的顏色是0.最后輸出這個矩形中。每一個顏色有多少個。某個范圍這個分為了四種,圓,矩形,菱形,還有正三角形(倒著的)。注意這題的邊界,不能超出這個矩形,非常easy越界。

解題思路:由于題的矩陣范圍是200 * 50000,然后操作又是50000,這樣三個相乘,即使給60s也是不夠的。由于行的數目比較少。假設每次都能將這一行哪個沒處理過直接拿出來。而不用一個一個推斷就快非常多了,這樣一來就相當于每一個格子僅僅要遍歷一次。所以這里就每行用一個并查集。標記這這個位置以及后面的位置能夠上色的起始位置。

然后顏色更新問題僅僅要將操作反著過來上色就能夠處理了。

代碼:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>using namespace std;
const int M = 50005;
const int N = 205;int f[N][M];
int G[N][M];
int color[10];
int n, m, q;
char str[N];struct OP {char type;int x, y, l, r, c;
}op[M];int getParent (int x, int y) { return y == f[x][y] ?

y : f[x][y] = getParent (x, f[x][y]); } void init() { for (int i = q - 1; i >= 0; i--) { scanf ("%s", str); if (str[0] == 'D') scanf ("%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].c); else if (str[0] == 'T') scanf ("%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].c); else if (str[0] == 'R') scanf ("%d%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].r, &op[i].c); else scanf ("%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].c); op[i].type = str[0]; } for (int i = 0; i <= n; i++) for (int j = 0; j <= m; j++) f[i][j] = j; memset (color, 0, sizeof (color)); } void circle (int x, int y, int r, int c) { int L, R, s; for (int i = -r; i <= r; i++) { s = sqrt(r * r - i * i); if (i + x >= n || i + x < 0) continue; L = max(y - s, 0); L = max (getParent (i + x, L), L); R = min (s + y, m - 1); for (int j = L; j <= R; j++) { if (j == getParent (i + x, j)) { color[c]++; f[i + x][j] = R + 1; } else j = getParent(i + x, j) - 1; } } } void diamond (int x, int y, int r, int c) { int L, R; for (int i = -r; i <= r; i++) { if (i + x >= n || i + x < 0) continue; R = min (r - abs(i) + y, m - 1); L = max (abs(i) - r + y, 0); L = max (L, getParent (i + x, L)); for (int j = L; j <= R; j++) { if (j == getParent (i + x, j)) { color[c]++; f[i + x][j] = R + 1; } else j = getParent (i + x, j) - 1; } } } void rectangle (int x, int y, int l, int w, int c) { int L, R; for (int i = x; i < min(x + l, n); i++) { L = max (y, getParent (i, y)); R = min (y + w - 1, m - 1); for (int j = L; j <= R; j++) { if (j == getParent (i, j)) { color[c]++; f[i][j] = R + 1; } else j = getParent (i, j) - 1; } } } void triangle (int x, int y, int w, int c) { int L, R, h; h = (w + 1) / 2; for (int i = 0; i < h; i++) { if (i + x >= n) break; L = max (y - h + i + 1, 0); L = max (getParent(i + x, L), L); R = min (y + h - i - 1, m - 1); for (int j = L; j <= R; j++) { if (j == getParent (i + x, j)) { color[c]++; f[i + x][j] = R + 1; } else j = getParent (i + x, j) - 1; } } } void solve () { for (int i = 0; i < q; i++) { if (op[i].type == 'D') diamond (op[i].x, op[i].y, op[i].l, op[i].c); else if (op[i].type == 'C') circle (op[i].x , op[i].y, op[i].l, op[i].c); else if (op[i].type == 'T') triangle (op[i].x, op[i].y, op[i].l, op[i].c); else rectangle (op[i].x, op[i].y, op[i].l, op[i].r, op[i].c); } } int main () { char str[N]; while (scanf ("%d%d%d", &n, &m, &q) != EOF) { init (); solve(); for (int i = 1; i < 9; i++) printf ("%d ", color[i]); printf ("%d\n", color[9]); } return 0; }

轉載于:https://www.cnblogs.com/mfrbuaa/p/5381511.html

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

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

相關文章

Hyper-v Server 2012 Release Candidate 部署體驗

很多人知道&#xff0c;Microsoft Hyper-V分為兩種類型&#xff1a;一種是作為Windows Server的一個組件&#xff0c;另一種是作為虛擬化產品的單獨服務器。雖然兩者都是技術上的Hyper-V&#xff0c;每個版本的特性和用例各不相同。 Hyper-V Server直接在物理機器硬件上運行&am…

Unity 讀取資源(圖片)

方法一&#xff1a; 采用Resource.Load方法讀取&#xff0c;讀取在Unity中Assets下Resources目錄下的資源名&#xff08;不采用后綴&#xff09;。 //圖片放在Asset/Resources/ Texture2D tex (Texture2D)Resources.Load("圖片名稱"); 方法二&#xff1a; 采用WWW類…

【Python3 SelectKBest 調用personer出現的錯誤】

初始 相關系數過濾法調用函數 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr SelectKBest(lambda X,Y:np.array(map(lambda x:pearsonr(x,Y),X.T)).T,k2) .fit_transform(X_test,y_test) TypeError: float() argument must be a strin…

ABB機器人的錯誤處理

ABB機器人的錯誤處理 errnum 數據類型 errnum用于描述在執行過程中&#xff0c;發生的所有可恢復的錯誤。例如程序執行時&#xff0c;被零除。 如果機器人程序執行過程中檢測到一個錯誤&#xff0c;錯誤非致命&#xff0c;可以被錯誤處理程序處理。 這類錯誤的典型例子是…

面向對象的七大原則

總脈絡圖&#xff1a; 一&#xff1a;單一職責原則(全稱&#xff1a;“Single-Responsibility Principle”)又稱 單一功能原則 核心&#xff1a;解耦和增強內聚性&#xff08;高內聚&#xff0c;低耦合&#xff09; 說明&#xff1a; 就一個類而言&#xff0c;應該只專注于做一…

福建工程學院寒假作業G題

漲姿勢題就是所謂的優化題&#xff0c;在組隊賽中&#xff0c;隊伍發現了一題水題&#xff0c;那么應該交給誰去處理&#xff1f;作為處理水題的代碼手&#xff0c;應該具備什么樣的素養&#xff1f;1&#xff0c;要快&#xff0c;水題拼的就是速度&#xff01;2&#xff0c;不…

excel 多列匹配相等后 引用值

2019獨角獸企業重金招聘Python工程師標準>>> 場景 如圖下&#xff0c;當A、B列與E、F列皮配上&#xff0c;C列則引用G列的值 原理 VLOOKUP只能查找單列值。我們可以把多列值拼接后形成一個虛擬列&#xff0c;然后VLOOKUP函數查找這個虛擬列進行匹配。 在C1處輸入下…

【BUG調試】——OSError: Caught OSError in DataLoader worker process 0

目錄 問題描述&#xff1a; 參考鏈接 問題分析 解決方案 出現情況 問題描述&#xff1a; 在使用pytorch搭建了VGG從頭開始訓練時出現了以下問題&#xff1a; OSError: Caught OSError in DataLoader worker process 0 參考鏈接 參考up主視頻&#xff1a;4.2 使用pytor…

cvAdd()和 cvAddS()函數的使用

函數原型如下&#xff1a; voidcvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* maskNULL ); src1 第一個原數組 src2 第二個原數組 dst 輸出數組 mask 操作的復蓋面, 8-bit單通道數組; 只有復蓋面指定的輸出數組被修改。 函數 cvAdd 加一個數…

設計模式之接口隔離原則

這個原則想必大家從字面就可以猜出大體的含義&#xff0c;其實這個原則可以說是依賴倒置原則的一種進化補充&#xff0c;因為依賴倒置原則告訴我們實現類的各種依賴關系應該盡量隔離在抽象里面&#xff0c;同時底層的接口協議不應該依賴上層協議的變更而變更&#xff0c;所以我…

iOS 圖解多線程

轉載于:https://www.cnblogs.com/OnNineMonkey/p/5385963.html

Egret之位圖字體

1 , 關于位圖字體的制作 2 , egret官方提供的資源 看看cartoon-font.fnt的內容 {"file":"cartoon-font.png","frames":{ "A":{"x":1,"y":54,"w":21,"h":24,"offX":2,"offY&qu…

【機器視覺】——平面測量實際尺寸(像素尺寸轉物理尺寸)

目錄 方法一:比例尺法 方法:二:三角法 方法三:相機標定 以下方法均在平面的前提下進行 方法一:比例尺法 在一張紙上繪制一個帶刻度的直線,將紙張放在攝像頭下,抓取任意兩點的像素坐標,計算像素距離pd,再根據刻度讀取實際距離ad,根據兩者可以求出縮放比例,即地圖上…

圖像處理基本算法-濾波

線性濾波器的向量表示&#xff1a; W是一個大小為m*n的濾波器的系數&#xff0c;Z為由濾波器覆蓋的相應圖像的灰度值。 線性濾波器所能是實現的就是乘積求和操作。 幾種常見的濾波器&#xff1a; 平滑空間濾波器如均值濾波 統計排序濾波器如中值濾波 銳化空間濾波器如銳化…

20145122《Java面向對象程序設計》實驗二實驗報告

實驗名稱&#xff1a; Java面向對象程序設計 實驗內容&#xff1a; 初步掌握單元測試和TDD理解并掌握面向對象三要素&#xff1a;封裝、繼承、多態初步掌握UML建模熟悉S.O.L.I.D原則了解設計模式 PSP時間 步驟耗時百分比需求分析1h12.5%設計1h12.5%代碼實現3h37.5%測試1h12.5%分…

iOS中AutoLayer自動布局流程及相關方法

關于UIView的Layer&#xff0c;IOS提供了三個方法&#xff1a; 1、layoutSubviews 系統重寫布局:在iOS5.1和之前的版本&#xff0c;此方法的缺省實現不會做任何事情(實現為空)&#xff0c;iOS5.1之后(iOS6開始)的版本&#xff0c;此方法的缺省實現是使用你設置在此view上面的co…

移動開發web第一天

一、適配問題解決方案&#xff1a;流式布局 viewport1、流式布局百分比布局&#xff0c;通過設置盒子的寬度為百分比來根據屏幕的大小進行伸縮&#xff0c;特點是不受固定像素的限制&#xff0c;內容向兩側填充2、viewport在移動端用來承載網頁的這個區域&#xff0c;就是我們…

均值濾波 中值濾波 高斯平滑濾波

均值濾波是典型的線性濾波算法&#xff0c;它是指在圖像上對目標像素給一個模板&#xff0c;該模板包括了其周圍的臨近像素&#xff08;以目標象素為中心的周圍8個像素&#xff0c;構成一個濾波模板&#xff0c;即去掉目標像素本身&#xff09;&#xff0c;再用模板中的全體像素…

javaWeb開發總結 ---- 前端數據插入到后臺

一&#xff0c;概述&#xff1a; 本文主要描述如何將數據通過表單提交到后臺并插入到數據庫&#xff0e;其中后臺使用spring框架&#xff0e; 二&#xff0c;開發流程&#xff1a; 明確需求&#xff0c;即將什么數據插入到數據庫平臺搭建&#xff0c;配置spring, 數據庫&#…