Submission #1144831

#TimeUsernameProblemLanguageResultExecution timeMemory
1144831mnbvcxz123Roads (CEOI20_roads)C++20
100 / 100
104 ms9900 KiB
#include <bits/stdc++.h> using namespace std; constexpr size_t N = 100001; constexpr int32_t X = 100000000; int32_t x; struct segment { int32_t x1, y1, x2, y2, rx, ry; double get_y() const { return x1 == x2 ? y1 : y1 + (double)(y2 - y1) / (x2 - x1) * (x - x1); } bool operator<(segment const &s) const { return get_y() < s.get_y(); } }; segment s[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); size_t n; cin >> n; vector<tuple<int32_t, int32_t, int32_t, int32_t>> e; for (size_t i = 0; i < n; ++i) { cin >> s[i].x1 >> s[i].y1 >> s[i].x2 >> s[i].y2; if (s[i].x2 < s[i].x1 || (s[i].x1 == s[i].x2 && s[i].y2 < s[i].y1)) swap(s[i].x1, s[i].x2), swap(s[i].y1, s[i].y2); e.emplace_back(s[i].x1, s[i].y1, 0, i); e.emplace_back(s[i].x2, s[i].y2, 1, i); } sort(e.begin(), e.end()); auto compare_segment = [](auto const &a, auto const &b) { return s[a] < s[b]; }; set<int32_t, decltype(compare_segment)> t(compare_segment); s[n] = (segment){-X, -X, X, -X, -X, -X}; t.insert(n); for (auto const &[_x, _y, type, i] : e) { x = _x; if (!type) { auto it = --t.lower_bound(i); if (s[*it].rx != -X) cout << s[*it].rx << ' ' << s[*it].ry << ' ' << s[i].x1 << ' ' << s[i].y1 << '\n'; s[*it].rx = s[i].x1, s[*it].ry = s[i].y1; it = t.insert(i).first; s[*it].rx = s[i].x1, s[*it].ry = s[i].y1; } else { auto it = t.find(i); it = --t.erase(it); s[*it].rx = s[i].x2, s[*it].ry = s[i].y2; } } }
#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...