Submission #1253208

#TimeUsernameProblemLanguageResultExecution timeMemory
1253208idiotcomputerWorld Map (IOI25_worldmap)C++20
100 / 100
21 ms2888 KiB
//IOI 2025 Day 1 Problem C 

#include <bits/stdc++.h>
using namespace std;
#define ll long long int 
#define pb push_back
#define sz(x) (int) (x).size()
#define vi vector<int>
#define f first
#define s second 
#include "worldmap.h"

const int mxN = 45;
int n;

vi adj[mxN];
int first[mxN];
bool vis[mxN];
vi ord;

void dfs(int node, int p){
    vis[node] = 1;
    first[node] = sz(ord);
    ord.pb(node);
    for (int i : adj[node]){
        if (i == p || vis[i]) continue;
        dfs(i,node);
        ord.pb(node);
    }
}



vector<vi> create_map(int N, int m, vi a, vi b){
    n = N;
    for (int i = 0; i < n; i++) adj[i].clear(),vis[i]=0;
    for (int i = 0; i < m; i++) adj[a[i]-1].pb(b[i]-1), adj[b[i]-1].pb(a[i]-1);

    ord.clear();
    dfs(0,-1);

    vector<vi> grid(2*n);
    for (int i = 0; i < 2*n; i++) grid[i].resize(2*n);

    //for (int i = 0; i < n; i++) cout << first[i] << " ";
    //cout << '\n';
    //for (int i : ord) cout << i << " ";
    //cout << '\n';
    //return grid;

    int idx[n];
    memset(idx,0,sizeof(idx));
    int cnt = 1;
    int l = 0;
    int r = sz(ord)-1;
    while (l <= r){
        if (idx[ord[l]] == 0) idx[ord[l]] = cnt, cnt++;
        l++;
        if (l > r) break;
        if (idx[ord[r]] == 0) idx[ord[r]] = cnt, cnt++;
        r--;
    }
    //for (int i = 0; i < n; i++) cout << idx[i] << " ";
    //cout << "\n\n";
    //return grid;
    l = 0;
    //ord.pop_back();
    for (int i = 0; i < sz(ord); i++){
        int c = ord[i];
        int mj = max(l-2*n+1,0);
        for (int j = mj; j <= min(2*n-1,l); j++) grid[j][l-j] = c+1;
        l++;
        if (first[c] == i){
            //add in adj
            mj = max(l-2*n+1,0);
            for (int j = mj; j <= min(2*n-1,l); j++) grid[j][l-j] = c+1;
            int cj = 0;
            for (int i : adj[c]) if (idx[i] < idx[c]) grid[mj+cj][l-cj-mj] = i+1, cj++;
            l++;
            mj = max(l-2*n+1,0);
            for (int j = mj; j <= min(2*n-1,l); j++) grid[j][l-j] = c+1;
            l++;
        }
    }
    return grid;
}

/*
int main() {
  int T;
  assert(1 == scanf("%d", &T));

  std::vector<int> Nt(T), Mt(T);
  std::vector<std::pair<std::vector<int>, std::vector<int>>> AB;

  for (int t = 0; t < T; ++t) {
    assert(2 == scanf("%d %d", &Nt[t], &Mt[t]));

    int M = Mt[t];
    std::vector<int> A(M), B(M);

    for (int i = 0; i < Mt[t]; i++) {
      assert(2 == scanf("%d %d", &A[i], &B[i]));
    }
    AB.push_back(make_pair(A, B));
  }

  fclose(stdin);

  std::vector<std::vector<std::vector<int>>> Ct;

  for (int t = 0; t < T; t++) {
    int N = Nt[t], M = Mt[t];
    std::vector<int> A = AB[t].first, B = AB[t].second;

    auto C = create_map(N, M, A, B);
    Ct.push_back(C);
  }

  for (int t = 0; t < T; t++) {
    auto& C = Ct[t];
    int P = (int)C.size();

    std::vector<int> Q(P);
    for (int i = 0; i < P; ++i)
      Q[i] = (int)C[i].size();

    printf("%d\n", P);
    for (int i = 0; i < P; ++i)
      printf("%d%c", Q[i], " \n"[i + 1 == P]);
    printf("\n");
    for (int i = 0; i < P; i++) {
      for (int j = 0; j < Q[i]; j++) {
        printf("%d%c", C[i][j], " \n"[j + 1 == Q[i]]);
      }
    }
    if (t < T - 1)
      printf("\n");
  }

  fclose(stdout);

  return 0;
}*/

#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...