제출 #367771

#제출 시각아이디문제언어결과실행 시간메모리
367771arnold518Paint (COI20_paint)C++14
0 / 100
430 ms100020 KiB
#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]; unordered_map<int, unordered_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); int tx=C[x], ty=C[y]; for(auto &it : adj[x]) { for(auto &jt : it.second) { int t=Find(jt); if(t==y) continue; if(t==x) continue; adj[y][it.first].insert(t); adj[t][tx].erase(x); adj[t][ty].insert(y); } } adj[y][tx].erase(x); //adj[x].clear(); 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)][A[i+1][j]].insert(f(i+1, j)); adj[f(i+1, j)][A[i][j]].insert(f(i, j)); } } if(j!=M) { if(A[i][j]!=A[i][j+1]) { adj[f(i, j+1)][A[i][j]].insert(f(i, j)); adj[f(i, j)][A[i][j+1]].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 now=Find(f(B[i].y, B[i].x)); if(C[now]==B[i].c) continue; vector<int> VV; for(auto nxt : adj[now][C[now]]) { nxt=Find(nxt); if(C[nxt]==C[now]) { VV.push_back(nxt); } } for(auto it : VV) Union(it, now); C[now]=B[i].c; } for(int i=1; i<=N; i++) { for(int j=1; j<=M; j++) { printf("%d ", C[Find(f(i, j))]); } printf("\n"); } }

컴파일 시 표준 에러 (stderr) 메시지

paint.cpp: In function 'int main()':
paint.cpp:62:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   62 |  scanf("%d%d", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~
paint.cpp:69:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   69 |    scanf("%d", &A[i][j]);
      |    ~~~~~^~~~~~~~~~~~~~~~
paint.cpp:119:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  119 |  scanf("%d", &Q);
      |  ~~~~~^~~~~~~~~~
paint.cpp:122:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  122 |   scanf("%d%d%d", &B[i].y, &B[i].x, &B[i].c);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...