제출 #1135700

#제출 시각아이디문제언어결과실행 시간메모리
1135700AvianshIzlet (COI19_izlet)C++20
0 / 100
705 ms36640 KiB
#include <bits/stdc++.h> using namespace std; struct dsu{ vector<int>root; vector<int>siz; vector<set<int>>childs; dsu(int n){ root=vector<int>(n); siz=vector<int>(n,1); childs=vector<set<int>>(n); iota(root.begin(),root.end(),0); for(int i = 0;i<n;i++){ childs[i].insert(i); } } bool unite(int x, int y){ x=findRoot(x); y=findRoot(y); if(x==y){ return 0; } if(siz[x]<siz[y]){ swap(x,y); } root[y]=x; siz[x]+=siz[y]; for(int i : childs[y]){ childs[x].insert(i); } return 1; } int findRoot(int x){ if(x==root[x]){ return x; } return root[x]=findRoot(root[x]); } }; const int maxn=3e3+5; vector<int>path; dsu ds(maxn); void dfs(int st, int p, int o, vector<int>(&g)[],int grid[][maxn]){ path.push_back(st); if(st!=o&&grid[o][st]==grid[o][p]){ int lo = 0; int hi = path.size()-1; while(lo<hi){ int mid = (lo+hi)/2; if(grid[path[mid]][st]==grid[path[mid]][p]){ lo=mid+1; } else{ hi=mid; } } ds.unite(path[lo-1],st); } for(int i : g[st]){ if(i==p) continue; dfs(i,st,o,g,grid); } path.pop_back(); } signed main(){ ios::sync_with_stdio(0); cin.tie(0); int s; cin >> s; int n; cin >> n; int grid[n][maxn]; vector<int>g[n]; for(int i = 0;i<n;i++){ for(int j = 0;j<n;j++){ cin >> grid[i][j]; if(grid[i][j]<=2){ if(ds.unite(i,j)){ g[i].push_back(j); g[j].push_back(i); } } } } ds=dsu(n); vector<int>path; set<int>vis; for(int i = 0;i<n;i++){ dfs(i,-1,i,g,grid); } for(int i = 0;i<n;i++){ cout << ds.findRoot(i)+1 << " "; } cout << "\n"; for(int i = 0;i<n;i++){ for(int j : g[i]){ if(j>i){ cout << i+1 << " " << j+1 << "\n"; } } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...