Submission #436383

#TimeUsernameProblemLanguageResultExecution timeMemory
436383VEGAnnFountain Parks (IOI21_parks)C++17
100 / 100
556 ms41632 KiB
#include "parks.h" #include <algorithm> #include <queue> #include <vector> const int kMax = 200005; std::vector<std::pair<int, int>> fountains[kMax]; bool isConnected(std::vector<std::vector<int>> adj) { int n = adj.size(); std::vector<bool> vis(n); std::queue<int> q; q.push(0); vis[0] = true; while (!q.empty()) { int u = q.front(); q.pop(); for (int v : adj[u]) { if (vis[v]) continue; vis[v] = true; q.push(v); } } return all_of(vis.begin(), vis.end(), [](bool visited) { return visited; }); } int construct_roads(std::vector<int> x, std::vector<int> y) { int n = x.size(); for (int i = 0; i < n; ++i) { fountains[x[i]].emplace_back(y[i], i); } for (int i = 0; i < kMax; ++i) { std::sort(fountains[i].begin(), fountains[i].end()); } std::vector<std::tuple<int, int, int, int, int>> pathways; std::vector<std::vector<int>> adj(n); for (int i = 0; i < n; ++i) { auto it = std::lower_bound(fountains[x[i] + 2].begin(), fountains[x[i] + 2].end(), std::make_pair(y[i], -1)); if (it != fountains[x[i] + 2].end() && it->first == y[i]) { int ny = x[i] + y[i] & 2 ? y[i] + 1 : y[i] - 1; pathways.emplace_back(x[i] + 1, ny, x[i] + y[i], i, it->second); adj[i].emplace_back(it->second); adj[it->second].emplace_back(i); } it = std::lower_bound(fountains[x[i]].begin(), fountains[x[i]].end(), std::make_pair(y[i] + 2, -1)); if (it != fountains[x[i]].end() && it->first == y[i] + 2) { int nx = x[i] + y[i] & 2 ? x[i] - 1 : x[i] + 1; pathways.emplace_back(nx, y[i] + 1, x[i] + y[i], i, it->second); adj[i].emplace_back(it->second); adj[it->second].emplace_back(i); } } if (!isConnected(adj)) return 0; std::sort(pathways.begin(), pathways.end()); std::vector<int> u, v, a, b; for (int i = 0; i < static_cast<int>(pathways.size()); ++i) { if (i > 0 && std::get<0>(pathways[i]) == std::get<0>(pathways[i - 1]) && std::get<1>(pathways[i]) == std::get<1>(pathways[i - 1])) { continue; } u.emplace_back(std::get<3>(pathways[i])); v.emplace_back(std::get<4>(pathways[i])); a.emplace_back(std::get<0>(pathways[i])); b.emplace_back(std::get<1>(pathways[i])); } build(u, v, a, b); return 1; }

Compilation message (stderr)

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:46:21: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   46 |       int ny = x[i] + y[i] & 2 ? y[i] + 1 : y[i] - 1;
parks.cpp:54:21: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   54 |       int nx = x[i] + y[i] & 2 ? x[i] - 1 : x[i] + 1;
#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...