제출 #1288735

#제출 시각아이디문제언어결과실행 시간메모리
1288735ecen30세계 지도 (IOI25_worldmap)C++20
0 / 100
3 ms828 KiB
//testing Ai code #include "worldmap.h" #include <vector> #include <set> #include <algorithm> using namespace std; vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) { // Build adjacency list vector<set<int>> adj(N + 1); for (int i = 0; i < M; i++) { adj[A[i]].insert(B[i]); adj[B[i]].insert(A[i]); } // Special case: No edges - just place all countries in a line if (M == 0) { vector<vector<int>> C(1, vector<int>(N)); for (int i = 0; i < N; i++) { C[0][i] = i + 1; } return C; } // General strategy: Create a cross pattern for each country // Each country occupies a + shape, allowing edges in 4 directions // Grid size: 3N x 3N (each country gets a 3x3 region, uses center + 4 arms) int K = 3 * N; K = min(K, 240); vector<vector<int>> C(K, vector<int>(K, 0)); // Assign each country i to position (3*i, 3*i) in a cross pattern for (int i = 1; i <= N; i++) { int base_r = (i - 1) * 3; int base_c = (i - 1) * 3; if (base_r + 2 < K && base_c + 2 < K) { // Create a cross pattern C[base_r + 1][base_c] = i; // Top C[base_r][base_c + 1] = i; // Left C[base_r + 1][base_c + 1] = i; // Center C[base_r + 2][base_c + 1] = i; // Right C[base_r + 1][base_c + 2] = i; // Bottom } } // Fill remaining cells with country 1 (to ensure no empty cells) for (int r = 0; r < K; r++) { for (int c = 0; c < K; c++) { if (C[r][c] == 0) { C[r][c] = 1; } } } // Create edges by connecting adjacent countries for (int e = 0; e < M; e++) { int u = A[e]; int v = B[e]; int base_u_r = (u - 1) * 3 + 1; int base_u_c = (u - 1) * 3 + 1; int base_v_r = (v - 1) * 3 + 1; int base_v_c = (v - 1) * 3 + 1; // Connect u and v by extending arms toward each other if (base_u_r < base_v_r && base_u_c < K - 1) { // u is above v, extend u downward C[base_u_r + 1][base_u_c] = u; if (base_u_r + 2 < K) C[base_u_r + 2][base_u_c] = v; } else if (base_u_r > base_v_r && base_u_r > 0) { // u is below v, extend u upward C[base_u_r - 1][base_u_c] = u; if (base_u_r - 2 >= 0) C[base_u_r - 2][base_u_c] = v; } if (base_u_c < base_v_c && base_u_r < K - 1) { // u is left of v, extend u rightward C[base_u_r][base_u_c + 1] = u; if (base_u_c + 2 < K) C[base_u_r][base_u_c + 2] = v; } else if (base_u_c > base_v_c && base_u_c > 0) { // u is right of v, extend u leftward C[base_u_r][base_u_c - 1] = u; if (base_u_c - 2 >= 0) C[base_u_r][base_u_c - 2] = v; } } // Optimization for better K/N ratio: Try smaller grid if (N <= 10) { // For small N, try a more compact 2D arrangement K = N + M / N + 2; K = max(K, 2); K = min(K, 240); C.assign(K, vector<int>(K, 1)); // Place countries in a spiral or grid pattern int r = 0, c = 0; for (int i = 1; i <= N; i++) { if (c < K) { C[r][c] = i; c++; if (c >= K) { c = 0; r++; } } } // Add adjacencies for (int e = 0; e < M; e++) { int u = A[e]; int v = B[e]; bool found = false; // Find where u is and place v adjacent for (int i = 0; i < K && !found; i++) { for (int j = 0; j < K && !found; j++) { if (C[i][j] == u) { // Try to place v adjacent if (i + 1 < K && (C[i + 1][j] == 1 || C[i + 1][j] == v)) { C[i + 1][j] = v; found = true; } else if (j + 1 < K && (C[i][j + 1] == 1 || C[i][j + 1] == v)) { C[i][j + 1] = v; found = true; } } } } } } return C; }
#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...