Submission #576437

#TimeUsernameProblemLanguageResultExecution timeMemory
576437timmyfengPaint (COI20_paint)C++17
100 / 100
931 ms492444 KiB
#include <bits/stdc++.h> using namespace std; #define V vector const int D[] = {0, 1, 0, -1}, M = 512, C = 1e5; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; V<int> co(n * m); for (auto &i : co) cin >> i; V<V<int>> ne(n * m), me(n * m); V<int> le(n * m); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { int id = i * m + j; le[id] = id; me[id].push_back(id); for (int d = 0; d < 4; ++d) { int in = i + D[d], jn = j + D[(d + 1) % 4]; if (0 <= in && in < n && 0 <= jn && jn < m) { ne[id].push_back(in * m + jn); } } } } V<V<set<int>>> nc(n * m); V<bool> iv(n * m); set<int> bg; auto normalize = [&](int a) { V<int> nn; for (auto b : ne[a]) { b = le[b]; if (le[b] != a && !iv[b]) { nn.push_back(b); iv[b] = true; } } swap(ne[a], nn); }; auto update = [&](int a) { if ((int) me[a].size() >= M) { for (auto b : bg) { if (a != b && nc[a][co[b]].count(b)) nc[b][co[a]].insert(a); } } else { normalize(a); for (auto b : bg) { if (iv[b]) nc[b][co[a]].insert(a); } for (auto b : ne[a]) iv[b] = false; } }; auto merge = [&](int a, int b) { if (me[a].size() < me[b].size()) swap(a, b); if ((int) me[a].size() < M && (int) (me[a].size() + me[b].size()) >= M) { nc[a].resize(C); for (auto u : ne[a]) nc[a][co[le[u]]].insert(le[u]); bg.insert(a); } if ((int) (me[a].size() + me[b].size()) >= M) { for (auto u : ne[b]) nc[a][co[le[u]]].insert(le[u]); nc[b].clear(); bg.erase(b); } for (auto i : me[b]) le[i] = a; me[a].insert(me[a].end(), me[b].begin(), me[b].end()); me[b].clear(); ne[a].insert(ne[a].end(), ne[b].begin(), ne[b].end()); ne[b].clear(); }; auto fill = [&](int a, int c) { a = le[a]; while (true) { if ((int) me[a].size() < M) { bool merged = false; auto in = ne[a]; for (auto b : in) { b = le[b]; if (b != a && co[b] == c) { merged = true; merge(a, b); a = le[a]; } } if (!merged) break; } else { if (nc[a][c].empty()) break; int b = *nc[a][c].begin(); nc[a][c].erase(b); b = le[b]; if (b != a && co[b] == c) { merge(a, b); a = le[a]; } } } co[a] = c; update(a); }; for (int i = 0; i < n * m; ++i) fill(i, co[i]); int q; cin >> q; while (q--) { int i, j, c; cin >> i >> j >> c; --i, --j; fill(i * m + j, c); } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cout << co[le[i * m + j]] << " "; } cout << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...