Submission #1250551

#TimeUsernameProblemLanguageResultExecution timeMemory
1250551nikdWorld Map (IOI25_worldmap)C++20
86 / 100
44 ms5448 KiB
#include "worldmap.h"
#include <bits/stdc++.h>
using namespace std;

std::vector<std::vector<int>> create_map(int N, int M, std::vector<int> A, std::vector<int> B) {

  std::vector<std::vector<int>> ans(3 * N, std::vector<int>(3 * N, 1));
  vector<vector<bool>> changed(3*N, vector<bool>(3*N, 0));
  
  vector<vector<int>> adj(N);
  for(int i = 0; i<M; i++){
    adj[A[i]-1].push_back(B[i]-1);
    adj[B[i]-1].push_back(A[i]-1);
  }
  
  vector<bool> vis(N, 0);
  vector<vector<int>> back(N);
  vector<vector<int>> t(N);

  auto dfs = [&](auto&& dfs, int v, int p)->void{
    vis[v] = 1;
    for(int u: adj[v]){
      if(u == p) continue;
      if(vis[u]) back[u].push_back(v);
      else{
        t[v].push_back(u);
        dfs(dfs, u, v);
      }
    }
    return;
  };

  dfs(dfs, 0, -1);
  vector<int> proc(N, INT_MAX);
  int timer = 0;
  auto rec = [&](auto&& rec, int c, int i0, int j0)->int{
    proc[c] = timer++;
    for(int i = i0+3; i<3*N; i++) ans[i][j0] = c+1;
    int curr_j = j0+1;
    for(int u: t[c]){
      curr_j = rec(rec, u, i0+3, curr_j)+1;
      for(int i = i0+3; i<3*N; i++) ans[i][curr_j] = c+1;
      curr_j++;
    } 
    curr_j--;
    int curr_j2 = j0+1;
    for(int u: back[c]){
      if(proc[u] < proc[c]) continue;
      ans[i0+1][curr_j2] = u+1;
      changed[i0+1][curr_j2] = 1;
      curr_j2+=2;
    }
    curr_j2--;
    for(int i = i0; i<i0+3; i++){
      for(int j = j0; j<=max(curr_j, curr_j2); j++) if(!changed[i][j]) ans[i][j] =c+1;
    }
    for(int j = curr_j+1; j<=curr_j2; j++){
      for(int i = i0+3; i<3*N; i++){
        ans[i][j] = c+1;
      }
    }
    //assert(curr_j2 < curr_j-1);
    return max(curr_j, curr_j2);
  };
  rec(rec, 0, 0, 0);
  return ans;
}
#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...