Submission #577422

#TimeUsernameProblemLanguageResultExecution timeMemory
577422czhang2718Paint (COI20_paint)C++17
0 / 100
277 ms232988 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]; int dx[]={-1, 0, 0, 1}; int dy[]={0, -1, 1, 0}; int find(int x){ return par[x]==x?x:par[x]=find(par[x]); } void join(int x, int y){ // cout << "join " << x << " " << y << nl; int a=find(x); int b=find(y); if(a==b) return; // cout << "ab " << a << " " << b << nl; 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) adj2[a][e.f].insert(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]+sz[b]<=B) { for(int k:adj[b]) if(find(k)!=a && find(k)!=b) adj[a].pb(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)); } 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); 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, c; cin >> x >> y >> c; x--; y--; int i=find(h(x,y)); col[i]=c; if(sz[i]>B){ vi nei; for(int p:adj2[i][c]) nei.pb(p); adj2[i][c].clear(); for(int k:nei) if(col[find(k)]==c) join(i, k); } else{ vi nei; for(int p:adj[i]) nei.pb(p); for(int k:nei){ if(col[find(k)]==c) join(i, k); } } i=find(i); if(sz[i]<=B){ assert(adj[i].size()<=4*B); for(int k:adj[i]){ k=find(k); if(sz[k]>B && k!=i) adj2[k][c].insert(i); } } else{ assert(big.size()<=r*c/B); 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][c].insert(i); } } } rep(i,0,r-1){ rep(j,0,c-1){ cout << col[find(h(i,j))] << " "; } cout << nl; } }

Compilation message (stderr)

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from paint.cpp:1:
paint.cpp: In function 'int main()':
paint.cpp:140:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  140 |    assert(big.size()<=r*c/B);
      |           ~~~~~~~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...