Submission #1251468

#TimeUsernameProblemLanguageResultExecution timeMemory
1251468InternetPerson10World Map (IOI25_worldmap)C++20
93 / 100
25 ms3004 KiB
#include "worldmap.h"
#include <bits/stdc++.h>

//  1
// 2  3
//   4 5
//
//
//   UU1U11111
//   U1U111111
//   1U1111111
//   U11111111

using namespace std;

set<int> vis;
vector<int> path;

vector<vector<int>> adj;

void dfs(int x) {
    path.push_back(x);
    vis.insert(x);
    for(int ch : adj[x]) {
        if(vis.count(ch)) continue;
        // take x out from ch
        vector<int> v2;
        v2.clear();
        for(int g : adj[ch]) {
            if(g != x) v2.push_back(g);
        }
        adj[ch] = v2;
        dfs(ch);
        path.push_back(x);
    }
}

vector<pair<int, vector<int>>> map_diag;

vector<vector<int>> create_map(int N, int M, std::vector<int> a, std::vector<int> b) {
    map_diag.clear();
    vis.clear();
    vector<int>().swap(path);
    vector<vector<int>>().swap(adj);
    adj.resize(N+1);
    for(int i = 0; i < M; i++) {
        adj[a[i]].push_back(b[i]);
        adj[b[i]].push_back(a[i]);
    }
    for(int i = 1; i <= N; i++) {
        sort(adj[i].begin(), adj[i].end());
    }
    dfs(1);
    // generate the map
    vis.clear();
    int min_map_diag_size = 0;
    int k = 0;
    int m = path.size();
    // cerr << "Path: ";
    // for(int g : path) cerr << g << ' ';
    // cerr << endl;
    while(vis.size() < N-1 || k < m) {
        int x = path[k%m];
        // cerr << "Now map diag has " << map_diag.size() << " and vis has " << vis.size() << endl;
        // cerr << "our new k is " << k << " and our x is " << x << endl;
        map_diag.push_back({0, {x}});
        if(k >= (int)adj[x].size()-2 && vis.count(x) == 0 && x != 1) {
            if(adj[x].size()) {
                map_diag.push_back({1, adj[x]});
                min_map_diag_size = max(min_map_diag_size, (int)map_diag.size() + (int)map_diag.back().second.size() - 1);
                map_diag.push_back({0, {x}});
            }
            vis.insert(x);
        }
        k++;
    }
    // cerr << "Map diag:\n";
    // for(auto [p, v] : map_diag) {
    //     cerr << p << " | ";
    //     for(int g : v) cerr << g << ' ';
    //     cerr << '\n';
    // }
    assert(map_diag.back().first == 0);
    while(map_diag.size() < min_map_diag_size) map_diag.push_back(map_diag.back());
    if(map_diag.size() % 2 == 0) map_diag.push_back(map_diag.back());
    int gridn = (map_diag.size() + 1) / 2;
    vector<vector<int>> ans(gridn, vector<int>(gridn));
    for(int i = 0; i < map_diag.size(); i++) {
        for(int j = 0; j < gridn; j++) {
            if(i-j < 0 || i-j >= gridn) continue;
            ans[j][i-j] = map_diag[i].second.back();
            if(map_diag[i].second.size() > 1) map_diag[i].second.pop_back();
        }
    }
    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...