Submission #1252743

#TimeUsernameProblemLanguageResultExecution timeMemory
1252743thelegendary08World Map (IOI25_worldmap)C++17
100 / 100
28 ms3140 KiB
#include "worldmap.h" #include<bits/stdc++.h> #define pb push_back #define mp make_pair #define int long long #define vi vector<int> #define vvi vector<vector<int>> #define pii pair<int, int> #define vpii vector<pair<int, int>> #define vc vector<char> #define vb vector<bool> #define mii map<int,int> #define f0r(i,n) for(int i=0;i<n;i++) #define FOR(i,k,n) for(int i=k;i<n;i++) #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define in(a) int a; cin>>a #define in2(a,b) int a,b; cin>>a>>b #define in3(a,b,c) int a,b,c; cin>>a>>b>>c #define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d #define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];} #define out(a) cout<<a<<'\n' #define out2(a,b) cout<<a<<' '<<b<<'\n' #define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n' #define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n' #define pout(a) cout<<a.first<<' '<<a.second<<'\n' #define vout(v) for(auto u : v){cout<<u<<' ';} cout<<endl #define dout(a) cout<<a<<' '<<#a<<endl #define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<endl #define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';} const int leg = 1e9 + 7; const int mod = 998244353; using namespace std; const int mxn = 45; vvi adj(mxn), edj(mxn); vi euler_tour; struct DSU{ int n; vi par, sz; DSU(int N){ n = N; par.resize(n); sz.resize(n); f0r(i, n)par[i]=i,sz[i]=1; } int find(int x){ if(par[x] == x)return x; return par[x] = find(par[x]); } void unite(int a, int b){ a = find(a); b = find(b); if(sz[a] < sz[b])swap(a,b); sz[a] += sz[b]; par[b] = a; } }; void dfs(int node, int from){ euler_tour.pb(node); for(auto u : edj[node]){ if(u != from)dfs(u, node), euler_tour.pb(node); } } std::vector<std::vector<signed>> create_map(signed N, signed M, std::vector<signed> A, std::vector<signed> B) { std::vector<std::vector<signed>> grid(2 * N, std::vector<signed>(2 * N, 1)); f0r(i, N+1){ adj[i].clear(); edj[i].clear(); } euler_tour.clear(); vector<vpii>diags(4 * N - 1); vvi pending(N+1); f0r(i, 2 * N){ f0r(j, 2 * N){ diags[i + j].pb(mp(i,j)); } } f0r(i, M){ adj[A[i]].pb(B[i]); adj[B[i]].pb(A[i]); } DSU d = DSU(N+1); f0r(i, M){ int x = A[i]; int y = B[i]; if(d.find(x) != d.find(y)){ d.unite(x,y); edj[x].pb(y); edj[y].pb(x); } } vector<vb>done(N+1, vb(N+1)); vvi ans; vb vis(N+1); dfs(1,-1); int ptr = 0; f0r(i, N+1){ for(auto u : edj[i]){ done[i][u] = 1; done[u][i] = 1; } // vout(edj[i]); } f0r(i, N+1){ sort(all(adj[i])); } vi diag_name(N+1); vi diag_length(N+1); for(auto v : euler_tour){ if(!vis[v]){ vi tmp; f0r(i, diags[ptr].size())tmp.pb(v); ans.pb(tmp); ptr++; vi t2; /* for(auto x : pending[v]){ t2.pb(x); done[v][x] = 1; done[x][v] = 1; } if(v == 1){ // vout(t2); } for(auto u : adj[v]){ if(t2.size() >= diags[ptr].size())break; if(!done[u][v]){ done[u][v] = 1; done[v][u] = 1; t2.pb(u); } } if(v == 1){ // vout(t2); } for(auto u : adj[v]){ if(!done[u][v]){ pending[u].pb(v); } } if(t2.empty())t2.pb(v); */ diag_name[v] = ptr; diag_length[v] = diags[ptr].size(); ans.pb(t2); ptr++; vi t3; f0r(i, diags[ptr].size())t3.pb(v); ans.pb(t3); ptr++; vis[v] = 1; } else{ vi tmp; f0r(i, N)tmp.pb(v); ans.pb(tmp); ptr++; } } f0r(i, ans.size()){ // vout(ans[i]); } vpii ord; FOR(i,1,N+1){ ord.pb(mp(diag_length[i], i)); } sort(all(ord)); f0r(i, ord.size()){ int v = ord[i].second; int l = ord[i].first; vi tmp; vpii nxt; for(auto u : adj[v]){ nxt.pb(mp(diag_length[u], u)); } sort(all(nxt)); for(auto [d, u] : nxt){ if(tmp.size() == l)break; if(!done[u][v]){ done[u][v] = 1; done[v][u] = 1; tmp.pb(u); } } if(tmp.size() == 0)tmp.pb(v); ans[diag_name[v]] = tmp; } // vout(euler_tour); int p1 = 0; // dout(ans.size()); f0r(i, 4 * N - 1){ // if(diags[i].size() >= N){ if(p1 < ans.size()){ int p2 = 0; for(auto [x,y] : diags[i]){ if(p2 == ans[p1].size()){ grid[x][y] = ans[p1][p2-1]; } else{ grid[x][y] = ans[p1][p2]; p2++; } } p1++; } // } } f0r(i, ans.size()){ // vout(ans[i]); } return grid; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...