Submission #1253343

#TimeUsernameProblemLanguageResultExecution timeMemory
1253343vuviet세계 지도 (IOI25_worldmap)C++20
0 / 100
1 ms324 KiB
#include <bits/stdc++.h>
using namespace std;

typedef vector<int> vi;

// Hàm tạo bản đồ thỏa mãn các điều kiện đề bài
vector<vi> create_map(int N, int M, vi A, vi B) {
    // Danh sách kề dạng ma trận
    vector<vector<bool>> adj(N + 1, vector<bool>(N + 1, false));
    for (int i = 0; i < M; i++) {
        adj[A[i]][B[i]] = adj[B[i]][A[i]] = true;
    }

    int K = 4 * N; // K vừa đủ với N <= 15
    vector<vi> grid(K, vi(K, 0));
    queue<pair<int, int>> q;

    // Bước 1: Gieo hạt ban đầu cho mỗi quốc gia
    for (int i = 1; i <= N; i++) {
        int r = 3 * (i - 1), c = 3 * (i - 1);
        grid[r][c] = i;
        q.emplace(r, c);
    }

    // Hàm kiểm tra có thể tô màu tại (r,c) không
    auto can_color = [&](int r, int c, int color) {
        int dr[] = {-1, 1, 0, 0};
        int dc[] = {0, 0, -1, 1};
        for (int d = 0; d < 4; d++) {
            int nr = r + dr[d], nc = c + dc[d];
            if (nr < 0 || nr >= K || nc < 0 || nc >= K) continue;
            int neighbor = grid[nr][nc];
            if (neighbor != 0 && !adj[color][neighbor]) return false;
        }
        return true;
    };

    // Bước 2: Multi-source BFS để lan màu
    while (!q.empty()) {
        auto [r, c] = q.front(); q.pop();
        int color = grid[r][c];
        int dr[] = {-1, 1, 0, 0};
        int dc[] = {0, 0, -1, 1};
        for (int d = 0; d < 4; d++) {
            int nr = r + dr[d], nc = c + dc[d];
            if (nr < 0 || nr >= K || nc < 0 || nc >= K) continue;
            if (grid[nr][nc] == 0 && can_color(nr, nc, color)) {
                grid[nr][nc] = color;
                q.emplace(nr, nc);
            }
        }
    }

    // Bước 3: Điền các ô còn trống (hiếm gặp)
    for (int r = 0; r < K; r++) {
        for (int c = 0; c < K; c++) {
            if (grid[r][c] == 0) {
                for (int color = 1; color <= N; color++) {
                    if (can_color(r, c, color)) {
                        grid[r][c] = color;
                        break;
                    }
                }
            }
        }
    }

    // ============================
    // KIỂM TRA ĐẦU RA (ASSERTIONS)
    // ============================

    // Điều kiện 1: Mỗi quốc gia phải xuất hiện ít nhất một lần
    vector<bool> used(N + 1, false);
    for (int r = 0; r < K; r++)
        for (int c = 0; c < K; c++) {
            int color = grid[r][c];
            assert(1 <= color && color <= N);
            used[color] = true;
        }
    for (int i = 1; i <= N; i++) assert(used[i]);

    // Điều kiện 2: Mỗi cặp (A[i], B[i]) phải có ít nhất một cặp ô liền kề
    set<pair<int, int>> required;
    for (int i = 0; i < M; i++) {
        required.insert({A[i], B[i]});
        required.insert({B[i], A[i]});
    }

    set<pair<int, int>> seen;
    int dr[] = {-1, 1, 0, 0};
    int dc[] = {0, 0, -1, 1};
    for (int r = 0; r < K; r++) {
        for (int c = 0; c < K; c++) {
            int u = grid[r][c];
            for (int d = 0; d < 4; d++) {
                int nr = r + dr[d], nc = c + dc[d];
                if (nr < 0 || nr >= K || nc < 0 || nc >= K) continue;
                int v = grid[nr][nc];
                if (u != v) {
                    seen.insert({u, v});
                }
            }
        }
    }

    for (int i = 0; i < M; i++) {
        assert(seen.count({A[i], B[i]}) || seen.count({B[i], A[i]}));
    }

    // Điều kiện 3: Không được có cặp màu khác nhau cạnh nhau nếu không nằm trong danh sách
    for (int r = 0; r < K; r++) {
        for (int c = 0; c < K; c++) {
            int u = grid[r][c];
            for (int d = 0; d < 4; d++) {
                int nr = r + dr[d], nc = c + dc[d];
                if (nr < 0 || nr >= K || nc < 0 || nc >= K) continue;
                int v = grid[nr][nc];
                if (u != v) {
                    assert(adj[u][v]); // chỉ được phép kề nếu có liên kết
                }
            }
        }
    }

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