답안 #367760

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
367760 2021-02-18T09:27:14 Z arnold518 Paint (COI20_paint) C++14
0 / 100
3000 ms 53180 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 200000;

const int dy[] = {-1, 1, 0, 0};
const int dx[] = {0, 0, -1, 1};

int N, M, Q;
vector<vector<int>> A;

int f(int y, int x)
{
	return x+(y-1)*M;
}

int C[MAXN+10];

struct Data
{
	int y, x, c;
};
Data B[MAXN+10];

set<int> adj[MAXN+10];
int par[MAXN+10];
int Find(int x)
{
	if(x==par[x]) return x;
	return par[x]=Find(par[x]);
}
void Union(int x, int y)
{
	x=Find(x); y=Find(y);
	if(adj[x].size()>adj[y].size()) swap(x, y);
	for(auto it : adj[x])
	{
		int t=Find(it);
		if(t==y) continue;
		if(t==x) continue;
		adj[y].insert(t);
	}
	par[x]=y;
}

int main()
{
	scanf("%d%d", &N, &M);
	A=vector<vector<int>>(N+10, vector<int>(M+10));

	for(int i=1; i<=N; i++)
	{
		for(int j=1; j<=M; j++)
		{
			scanf("%d", &A[i][j]);
		}
	}

	for(int i=1; i<=N*M; i++) par[i]=i;
	for(int i=1; i<=N; i++)
	{
		for(int j=1; j<=M; j++)
		{
			if(i!=N)
			{
				if(A[i][j]!=A[i+1][j])
				{
					adj[f(i, j)].insert(f(i+1, j));
					adj[f(i+1, j)].insert(f(i, j));
				}
			}
			if(j!=M)
			{
				if(A[i][j]!=A[i][j+1])
				{
					adj[f(i, j+1)].insert(f(i, j));
					adj[f(i, j)].insert(f(i, j+1));					
				}
			}
		}
	}
	for(int i=1; i<=N; i++) for(int j=1; j<=M; j++) C[f(i, j)]=A[i][j];

	for(int i=1; i<=N; i++)
	{
		for(int j=1; j<=M; j++)
		{
			if(i!=N)
			{
				if(A[i][j]==A[i+1][j])
				{
					Union(f(i, j), f(i+1, j));
				}
			}
			if(j!=M)
			{
				if(A[i][j]==A[i][j+1])
				{
					Union(f(i, j), f(i, j+1));
				}
			}
		}
	}

	scanf("%d", &Q);
	for(int i=1; i<=Q; i++)
	{
		scanf("%d%d%d", &B[i].y, &B[i].x, &B[i].c);
	}

	for(int i=1; i<=Q; i++)
	{
		int v=Find(f(B[i].y, B[i].x));
		if(C[v]==B[i].c) continue;
		C[v]=B[i].c;

		int now=Find(v);
		for(auto nxt : adj[now])
		{
			nxt=Find(nxt);
			if(C[nxt]==C[v])
			{
				Union(nxt, now);
			}
		}
	}

	for(int i=1; i<=N; i++)
	{
		for(int j=1; j<=M; j++)
		{
			printf("%d ", C[Find(f(i, j))]);
		}
		printf("\n");
	}
}

Compilation message

paint.cpp: In function 'int main()':
paint.cpp:52:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   52 |  scanf("%d%d", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~
paint.cpp:59:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   59 |    scanf("%d", &A[i][j]);
      |    ~~~~~^~~~~~~~~~~~~~~~
paint.cpp:109:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  109 |  scanf("%d", &Q);
      |  ~~~~~^~~~~~~~~~
paint.cpp:112:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  112 |   scanf("%d%d%d", &B[i].y, &B[i].x, &B[i].c);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 9836 KB Output is correct
2 Correct 10 ms 10092 KB Output is correct
3 Correct 15 ms 11756 KB Output is correct
4 Correct 126 ms 11884 KB Output is correct
5 Execution timed out 3020 ms 11756 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 88 ms 19112 KB Output is correct
2 Correct 1135 ms 26996 KB Output is correct
3 Execution timed out 3012 ms 31880 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3056 ms 53180 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3075 ms 44968 KB Time limit exceeded
2 Halted 0 ms 0 KB -