Submission #1263657

#TimeUsernameProblemLanguageResultExecution timeMemory
1263657gelastropodWorld Map (IOI25_worldmap)C++20
15 / 100
33 ms4424 KiB
#include "worldmap.h" #include <bits/stdc++.h> using namespace std; int N, numchosen; vector<vector<int>> adjlist, nadjlist; vector<vector<int>> ans; vector<int> visited; vector<int> selected; vector<int> null = {}; vector<vector<pair<int, vector<int>>>> mem; void dfsc(int n, int p) { visited[n] = 1; for (int i : adjlist[n]) { if (visited[i]) continue; dfsc(i, n); nadjlist[n].push_back(i); } } pair<int, vector<int>> dfscover(int n, bool take) { if (mem[n][take].first != -1) return mem[n][take]; vector<int> anss; if (!take) { for (int i : nadjlist[n]) { auto res = dfscover(i, true); for (int j : res.second) anss.push_back(j); } } else { anss.push_back(n); for (int i : nadjlist[n]) { auto res1 = dfscover(i, true); auto res2 = dfscover(i, false); if (res1.first > res2.first) swap(res1, res2); for (int j : res1.second) anss.push_back(j); } } return mem[n][take] = { anss.size(), anss }; } void filll(vector<int>& filled, int k) { vector<int> nn; for (int i = 0; i < 2 * N - 1 + 2 * (N / 2); i++) { if (!(i & 1) && i / 2 < filled.size()) nn.push_back(filled[i / 2] + 1); else nn.push_back(k + 1); } ans.push_back(nn); } void dfs(int n) { if (selected[n]) { filll(null, n); filll(adjlist[n], n); } for (int i : nadjlist[n]) { filll(null, n); dfs(i); } filll(null, n); } std::vector<std::vector<int>> create_map(int _N, int M, std::vector<int> A, std::vector<int> B) { ans = vector<vector<int>>(); N = _N; mem = vector<vector<pair<int, vector<int>>>>(N, vector<pair<int, vector<int>>> (2, pair<int, vector<int>>(-1, vector<int>()))); adjlist = vector<vector<int>>(N, vector<int>()); nadjlist = vector<vector<int>>(N, vector<int>()); selected = vector<int>(N, 0); visited = vector<int>(N, 0); for (int i = 0; i < M; i++) { A[i]--, B[i]--; adjlist[A[i]].push_back(B[i]); adjlist[B[i]].push_back(A[i]); } dfsc(0, -1); auto res1 = dfscover(0, false); auto res2 = dfscover(0, true); if (res1.first > res2.first) swap(res1, res2); for (int j : res1.second) selected[j] = 1; dfs(0); while (ans.size() < 2 * N - 1 + 2 * (N / 2)) filll(null, 0); 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...