Submission #777396

#TimeUsernameProblemLanguageResultExecution timeMemory
777396dozerPaint (COI20_paint)C++14
0 / 100
251 ms248836 KiB
#include <bits/stdc++.h> using namespace std; #define sp " " #define endl "\n" #define fileio() freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout) #define fastio() cin.tie(0), ios_base::sync_with_stdio(0) #define pb push_back #define pii pair<int, int> #define st first #define nd second #define N 200005 const int S = 400; vector<vector<int>> edges[N]; int sz[N], root[N], col[N]; vector<int> large[N], p[N]; vector<pii> dir; pii rev[N]; vector<int> done[N]; vector<int> ind[N]; int all[N]; inline int find(int node){ if (node == root[node]) return node; return root[node] = find(root[node]); } inline void uni(int a, int b){ a = find(a), b = find(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); root[b] = a; for (auto i : p[b]) p[a].pb(i); if (sz[a] < S && sz[a] + sz[b] > S){ edges[a].resize(N); done[a].resize(N, 0); done[a][a] = 1; for (auto i : p[a]){ if (all[i]) continue; int x = rev[i].st, y = rev[i].nd; int cnt = 0; for (auto j : dir){ int k = x + j.st, l = y + j.nd; int tmp = find(ind[k][l]); if (tmp == 0 || done[a][tmp]) continue; cnt++; edges[a][col[tmp]].pb(tmp); large[tmp].pb(a); } if (cnt == 0) all[i] = 1; } } else if (sz[a] >= S && sz[b] < S){ for (auto i : p[b]){ if (all[i]) continue; int cnt = 0; int x = rev[i].st, y = rev[i].nd; for (auto j : dir){ int k = x + j.st, l = y + j.nd; int tmp = find(ind[k][l]); if (tmp == 0 || done[a][tmp]) continue; edges[a][col[tmp]].pb(tmp); large[tmp].pb(a); cnt++; } if (cnt == 0) all[i] = 1; } } else if (sz[b] >= S && sz[a] >= S) { for (int i = 1; i < N; i++){ if (edges[a][i].size() < edges[b][i].size()) edges[a][i].swap(edges[b][i]); for (auto j : edges[b][i]) edges[a][i].pb(find(j)); /* sort(edges[a][i].begin(), edges[a][i].end()); unique(edges[a][i].begin(), edges[a][i].end())*/ } edges[b].clear(); } /*vector<int> tmp; for (auto i : large[a]) tmp.pb(find(i)); for (auto i : large[b]) tmp.pb(find(i)); sort(tmp.begin(), tmp.end()); unique(tmp.begin(), tmp.end()); large[a] = tmp; large[b].clear();*/ sz[a] += sz[b]; for (auto i : large[b]) large[a].pb(i); } inline void change_color(int node, int c){ node = find(node); col[node] = c; if (sz[node] >= S){ vector<int> tmp = edges[node][c]; for (auto i : tmp){ int gh = find(i); if (col[gh] == c) uni(gh, node); node = find(node); } edges[node][c].clear(); col[node] = c; } else{ vector<int> tmp = p[node]; for (auto i : tmp){ if (all[i]) continue; int cnt = 0; int x = rev[i].st, y = rev[i].nd; for (auto j : dir){ int k = x + j.st, l = y + j.nd; int tmp = find(ind[k][l]); if (tmp != node) cnt++; if (tmp != 0 && col[tmp] == c){ uni(tmp, node); } node = find(node); } if (cnt == 0) all[i] = 1; } } for (auto i : large[node]){ if (find(i) != node) edges[find(i)][c].pb(node); } col[node] = c; } int32_t main(){ #ifndef ONLINE_JUDGE //fileio(); #endif fastio(); dir.pb({0, 1}); dir.pb({1, 0}); dir.pb({0, -1}); dir.pb({-1, 0}); int r, s; cin>>r>>s; for (int i = 0; i <= r + 5; i++) ind[i].resize(s + 5, 0); int arr[r + 5][s + 5]; int cntr = 1; for (int i = 1; i <= r; i++){ for (int j = 1; j <= s; j++){ cin>>arr[i][j]; ind[i][j] = cntr; sz[cntr] = 1; p[cntr].pb(cntr); col[cntr] = arr[i][j]; root[cntr] = cntr; rev[cntr] = {i, j}; cntr++; } } for (int i = 1; i <= r; i++){ for (int j = 1; j <= s; j++){ for (auto k : dir){ int x = i + k.st, y = j + k.nd; if (ind[x][y] == 0) continue; if (arr[x][y] == arr[i][j]) uni(ind[i][j], ind[x][y]); } } } int q; cin>>q; while(q--){ int x, y, c; cin>>x>>y>>c; change_color(ind[x][y], c); } for (int i = 1; i <= r; i++){ for(int j = 1; j <= s; j++) cout<<col[find(ind[i][j])]<<sp; cout<<endl; } cerr<<"time taken : "<<(float)clock() / CLOCKS_PER_SEC<<" seconds\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...