# Greedy# Array# Iteration

e971 - 2. 梗圖著色 (Coloring)

🔗 前往 ZeroJudge 原題

題目描述

題目描述了將一張黑白梗圖中,每列成對的兩個黑色像素之間的白色像素塗黑的操作。輸入為一個 m x n 的二維陣列,其中 1 代表黑色,0 代表白色。輸出經過塗色後的陣列。

解題思路

這個問題可以使用貪心演算法解決。對於每一列,從左到右掃描,找到相鄰的兩個黑色像素(1)。然後,將這兩個黑色像素之間的所有白色像素(0)塗黑。重複此過程,直到掃描完所有列。程式碼直接在輸入的陣列上進行修改,避免了額外的空間開銷。使用 getchar_unlocked()putchar_unlocked() 函數可以提高輸入輸出的效率。

複雜度分析

  • 時間複雜度: O(m * n^2)。其中 m 是列數,n 是行數。最壞情況下,對於每一列,需要遍歷所有元素以找到相鄰的黑色像素並進行塗色。
  • 空間複雜度: O(1)。程式碼直接修改輸入陣列,沒有使用額外的資料結構。

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
int x,y,i,j,jj;
char a[101][101],b,c='0';
int main(){
	scanf("%d%d",&x,&y);
	for(;i<x;++i)
		for(j=0;j<y;++j)
			while(b=getchar_unlocked())
				if(b=='0'||b=='1'){
					a[i][j]=b;
					break;
				}
	for(i=0;i<x;++i)
		for(j=0;j<y;++j)
			if(a[i][j]=='1')
				for(jj=j+1;jj<y;++jj)
					if(a[i][jj]=='1'){
						for(;j<jj;++j)
							a[i][j]='1';
						break;
					}
	for(i=0;i<x;++i){
		for(j=0;j<y;++j){
			putchar_unlocked(a[i][j]);
			putchar_unlocked(' ');
		}
		putchar_unlocked('\n');
	}
}

Discussion