Submission #577507

#TimeUsernameProblemLanguageResultExecution timeMemory
577507czhang2718Paint (COI20_paint)C++17
31 / 100
438 ms47612 KiB
#include "bits/stdc++.h" using namespace std; typedef vector<int> vi; typedef long long ll; typedef pair<int, int> pii; #define f first #define s second #define pb push_back #define nl '\n' #define sz(x) (int) x.size() #define rep(i,a,b) for(int i=a; i<=b; i++) const int N=200000; const int B=500; int r, c, q; vector<vi> g; int par[N]; int sz[N]; int col[N]; vi adj[N]; vi big; map<int, set<int>> adj2[N]; // vector int dx[]={-1, 0}; int dy[]={0, -1}; int find(int x){ return par[x]==x?x:par[x]=find(par[x]); } void join(int x, int y){ int a=find(x); int b=find(y); if(a==b) return; if(sz[b]>sz[a]) swap(a,b); if(sz[a]>B && sz[b]>B){ for(auto e:adj2[b]){ for(int k:e.s){ if(find(k)!=a && find(k)!=b) adj2[a][col[find(k)]].insert(find(k)); } // shouldn't need find(k) } } else if(sz[a]>B && sz[b]<=B){ for(int k:adj[b]){ k=find(k); int c=col[k]; if(k!=a && k!=b) adj2[a][c].insert(k); } } else if(sz[a]<=B) { for(int k:adj[b]) if(find(k)!=a && find(k)!=b) adj[a].pb(find(k)); } if(sz[a]+sz[b]>B && sz[a]<=B){ big.pb(a); for(int k:adj[a]){ if(find(k)!=a && find(k)!=b) adj2[a][col[find(k)]].insert(find(k)); } adj[a].clear(); } par[b]=a; sz[a]+=sz[b]; } int h(int i, int j){ return c*i+j; } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> r >> c; g.resize(r, vi(c)); rep(i,0,r-1){ rep(j,0,c-1){ par[h(i,j)]=h(i,j); sz[h(i,j)]=1; rep(k,0,1){ int x=i+dx[k]; int y=j+dy[k]; if(x<0 || y<0) continue; adj[h(i,j)].pb(h(x,y)); adj[h(x,y)].pb(h(i,j)); } } } rep(i,0,r-1){ rep(j,0,c-1){ cin >> g[i][j]; col[h(i,j)]=g[i][j]; rep(k,0,1){ int x=i+dx[k]; int y=j+dy[k]; if(x<0 || y<0) continue; if(g[i][j]==g[x][y]) join(h(i,j), h(x,y)); } } } cin >> q; while(q--){ int x, y, co; cin >> x >> y >> co; x--; y--; int i=find(h(x,y)); col[i]=co; if(sz[i]>B){ vi nei; for(int p:adj2[i][co]) nei.pb(p); adj2[i][co].clear(); for(int k:nei) if(col[find(k)]==co) join(i, k); } else{ vi nei; for(int p:adj[i]) nei.pb(p); for(int k:nei){ if(col[find(k)]==co) join(i, k); } } i=find(i); if(sz[i]<=B){ for(int k:adj[i]){ k=find(k); if(sz[k]>B) adj2[k][co].insert(i); } } else{ for(int j:big){ j=find(j); if(j==i) continue; if(adj2[i][col[j]].find(j)!=adj2[i][col[j]].end()){ adj2[j][co].insert(i); // adj2[j][oldc].erase(old); } } } } rep(i,0,r-1){ rep(j,0,c-1){ cout << col[find(h(i,j))] << " "; } cout << nl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...