Submission #556912

#TimeUsernameProblemLanguageResultExecution timeMemory
556912timreizinFlood (IOI07_flood)C++17
100 / 100
333 ms20428 KiB
#include <iostream> #include <vector> #include <algorithm> #include <deque> #include <set> #include <string> #include <numeric> #include <cmath> #include <cassert> #include <array> #include <numeric> using namespace std; struct Point { array<int, 4> dir{-1, -1, -1, -1}; int x, y; }; int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<Point> points(n); for (Point &i : points) cin >> i.x >> i.y; int w; cin >> w; vector<int> adj(2 * w); vector<tuple<int, int, int>> segms(w); for (int i = 0; i < w; ++i) { int a, b; cin >> a >> b; --a; --b; segms[i] = {a, b, 0}; if (points[a].x == points[b].x) { if (points[a].y > points[b].y) swap(a, b); get<2>(segms[i]) = 3; points[a].dir[1] = 2 * i; points[b].dir[3] = 2 * i + 1; } else { if (points[a].x > points[b].x) swap(a, b); get<2>(segms[i]) = 0; points[a].dir[2] = 2 * i; points[b].dir[0] = 2 * i + 1; } get<0>(segms[i]) = a; get<1>(segms[i]) = b; } int cnt = 0; for (auto [a, b, c] : segms) { for (int i = (c + 1) % 4; ; i = (i + 1) % 4) { if (points[b].dir[i] != -1) { adj[2 * cnt] = points[b].dir[i]; break; } } for (int i = (c + 3) % 4; ; i = (i + 1) % 4) { if (points[a].dir[i] != -1) { adj[2 * cnt + 1] = points[a].dir[i]; break; } } ++cnt; } vector<int> used(2 * w, -1); auto dfs = [&adj, &used](auto self, int v, int face) -> void { used[v] = face; if (used[adj[v]] == -1) self(self, adj[v], face); }; int counter = 0; for (int i = 0; i < 2 * w; ++i) { if (used[i] == -1) { dfs(dfs, i, counter); ++counter; } } vector<vector<pair<int, int>>> faces(counter); for (int i = 0; i < w; ++i) { faces[used[2 * i]].emplace_back(i, used[2 * i + 1]); faces[used[2 * i + 1]].emplace_back(i, used[2 * i]); } int start; set<pair<int, int>> hor, vert; { int left = -1, up = -1, i = 0; for (auto [a, b, c] : segms) { if (points[a].x == points[b].x) vert.insert({points[a].x, i}); else hor.insert({points[a].y, i}); ++i; } if (left != -1) start = used[2 * left]; else start = used[2 * up]; } vector<int> saved = used; used = vector<int>(counter); vector<bool> isDel(w); while (!hor.empty() || !vert.empty()) { int start; { if (!vert.empty()) start = saved[2 * (vert.begin()->second)]; else start = saved[2 * (hor.begin()->second)]; } vector<int> next{start}; used[start] = 1; while (!next.empty()) { set<int> nnext; for (int f : next) { for (auto [v, f2] : faces[f]) { if (!used[f2]) { nnext.insert(f2); isDel[v] = true; } auto [a, b, c] = segms[v]; if (points[a].x == points[b].x) vert.erase({points[a].x, v}); else hor.erase({points[a].y, v}); } } next.clear(); for (int i : nnext) { next.push_back(i); used[i] = true; } } } vector<int> res; for (int i = 0; i < w; ++i) if (!isDel[i]) res.push_back(i + 1); cout << res.size() << '\n'; for (int i : res) cout << i << '\n'; return 0; }

Compilation message (stderr)

flood.cpp: In function 'int main()':
flood.cpp:98:9: warning: variable 'start' set but not used [-Wunused-but-set-variable]
   98 |     int start;
      |         ^~~~~
#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...
#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...