제출 #1302703

#제출 시각아이디문제언어결과실행 시간메모리
1302703aaaaaaaa세계 지도 (IOI25_worldmap)C++20
58 / 100
164 ms19556 KiB
#include "worldmap.h"
#include <bits/stdc++.h>
using namespace std;

#define all(x) x.begin(), x.end()

const int mxN = 42;

vector<int> adj[mxN], waiting[mxN];
vector<int> ord;
int parent[mxN], leaf[mxN];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};


int find(int u){
    if(parent[u] == u) return u;
    return parent[u] = find(parent[u]);
}

bool unite(int u, int v){
    u = find(u), v = find(v);
    if(u == v) return 0;
    parent[u] = v;
    return 1;
}

void dfs(int u = 1, int par = 0){

    for(auto it : adj[u]){
        if(it ^ par) {
             ord.push_back(u);
             dfs(it, u);
        }
    }
    if(u != 1) ord.push_back(u);
}

void reset(int N){
    ord.clear();
    for(int i = 1; i <= N; ++i){
        adj[i].clear();
        waiting[i].clear();
        parent[i] = i;
        leaf[i] = 0;
    }
}

vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {
    reset(N);
    vector<vector<bool>> mat(N + 5, vector<bool> (N + 5, 0));
  if(N == 1){
    return {{1}};
  }
  for(int i = 0; i < M; ++i){
    if(unite(A[i], B[i])){
        adj[A[i]].push_back(B[i]);
        adj[B[i]].push_back(A[i]);
    }
    waiting[A[i]].push_back(B[i]);
    waiting[B[i]].push_back(A[i]);
    mat[A[i]][B[i]] = 1;
    mat[B[i]][A[i]] = 1;
    mat[A[i]][A[i]] = 1;
    mat[B[i]][B[i]] = 1;
  }
  dfs(1, 0);
  vector<vector<int>> ans;
  int mx = 0;

  for(int i = 0; i < ord.size(); ++i){
    if(leaf[ord[i]]) {
        leaf[ord[i]] = 0;
        continue;
    }
    vector<int> top_layer = {ord[i]};
    vector<int> mid_layer;

    for(auto it : waiting[ord[i]]){
        mid_layer.push_back(it);
        mid_layer.push_back(ord[i]);
    }

    mx = max(mx, (int) mid_layer.size());

    ans.push_back(top_layer);
    if(mid_layer.size()) ans.push_back(mid_layer);
    ans.push_back(top_layer);
  }


    while(mx > ans.size()) ans.push_back(ans.back());

  for(int i = 0; i < (int) ans.size(); ++i){
        int x = ans[i][0];
        if(ans[i].size() > 1) x = ans[i][1];
        while((int) ans.size() > (int) ans[i].size()) {
            ans[i].push_back(x);
        }
        assert(ans.size() == ans[i].size());
  }


  assert(ans.size() <= 240);

reset(N);

    for(int i = 0; i < (int) ans.size(); ++i){
        assert(ans.size() == ans[i].size());
        for(int j = 0; j < (int) ans[i].size(); ++j){
            for(int k = 0; k < 4; ++k){
                int ni = i + dx[k], nj = j + dy[k];
                if(min(ni, nj) >= 0 && max(ni, nj) < (int) ans.size()){
                    assert(ans[i][j] <= N && ans[i][j] >= 1);
                   assert(ans[ni][nj] <= N && ans[ni][nj] >= 1);
                    if(ans[i][j] != ans[ni][nj]) {
                        //assert();
                        //cout << i << " " << j << "\n";
                        if(!mat[ans[i][j]][ans[ni][nj]]) cout << i << " " << j << "\n";
                    }
                }
            }
        }
    }


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