답안 #577722

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
577722 2022-06-15T08:23:42 Z tengiz05 Roads (CEOI20_roads) C++17
15 / 100
59 ms 5948 KB
#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

constexpr int inf = 1E9;

int Time;

struct Line {
    int x, y;
    double s;
    pair<int, int> l, r;
    Line() {}
    Line(int x1, int y1, int x2, int y2) {
        x = x1;
        y = y1;
        if (x2 - x1 == 0) {
            s = 0;
        } else {
            s = 1. * (y2 - y1) / (x2 - x1);
        }
        l = r = {x1, y1};
    }
};
double at(const Line x) {
    return x.y + (Time - x.x) * x.s;
}
inline bool operator<(const Line &a, const Line &b) {
    if (at(a) - at(b) < -1e-10)
        return true;
    return false;
}

bool bad(const pair<int, int> &x) {
    return abs(x.first) == inf;
}
Line p[100005];
struct Info {
    int x;
    Info(int x) : x(x) {}
};
bool operator<(const Info &a, const Info &b) {
    return p[a.x] < p[b.x];
}
int main() {
    // freopen("input1.txt", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    
    vector<tuple<int, int, int>> events;
    
    vector<int> X1(n + 2), Y1(n + 2), X2(n + 2), Y2(n + 2);
    
    for (int i = 1; i <= n; i++) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        if (x1 > x2) {
            swap(x1, x2);
            swap(y1, y2);
        } else if (x1 == x2 && y1 > y2) {
            swap(y1, y2);
        }
        events.emplace_back(x1, y1, i);
        events.emplace_back(x2, y2, -i);
        X1[i] = x1;
        Y1[i] = y1;
        X2[i] = x2;
        Y2[i] = y2;
    }
    
    sort(events.begin(), events.end());
    
    set<Info> s;
    p[0] = Line(-inf, -inf, inf, -inf);
    p[n + 1] = Line(-inf, inf, inf, inf);
    
    for (int i = 1; i <= n; i++) {
        p[i] = Line(X1[i], Y1[i], X2[i], Y2[i]);
    }
    s.insert(Info(0));
    s.insert(Info(n + 1));
    
    for (auto [x, y, i] : events) {
        Time = x;
        // cerr << "Checking " << x << " " << y << ", " << i << "\n";
            // for (auto x : s) {
                // cout << at(p[x.x]) << ", ";
            // }
            // cerr << "\nEnded\n";
        // cerr << "Checking " << x << " " << y << ", " << i << "\n";
            // for (auto x : s) {
                // cout << x.x << ", ";
            // }
            // cerr << "\nEnded\n";
        if (i > 0) {
            // cerr << prev(s.lower_bound(Info(i)))->x << ",";
            // cerr << next(s.lower_bound(Info(i)))->x << " ";
            auto &L = p[prev(s.upper_bound(Info(i)))->x];
            auto &R = p[s.upper_bound(Info(i))->x];
            // cerr << "HMM";
            if (!bad(L.r)) {
                cout << x << " " << y << " " << L.r.first << " " << L.r.second << "\n";
            } else if (!bad(R.l)) {
                cout << x << " " << y << " " << R.l.first << " " << R.l.second << "\n";
            } else {
            }
            // cerr << "NO";
            // L.r = {x, y};
            // R.l = {x, y};
            // cerr << "YAY";
            s.insert(Info(i));
            // cerr << "OK\n";
        } else {
            // cerr << "D";
            i = -i;
            // cerr << at(p[i]) << "\n";
            // assert(s.lower_bound(Info(i)) != s.end());
            // assert(s.lower_bound(Info(i))->x == i);
            // cerr << "s";
            // cerr << prev(s.lower_bound(Info(i)))->x << " ";
            // cerr << next(s.lower_bound(Info(i)))->x << " ";
            auto &L = p[prev(s.lower_bound(Info(i)))->x];
            auto &R = p[next(s.lower_bound(Info(i)))->x];
            L.r = {x, y};
            R.l = {x, y};
            s.erase(Info(i));
        }
    }
    
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3412 KB Output is correct
2 Failed 59 ms 5928 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3412 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 3 ms 3540 KB Output is correct
4 Correct 11 ms 4176 KB Output is correct
5 Correct 20 ms 4836 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3412 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 3 ms 3432 KB Output is correct
4 Correct 12 ms 4168 KB Output is correct
5 Correct 21 ms 4944 KB Output is correct
6 Correct 2 ms 3412 KB Output is correct
7 Correct 2 ms 3412 KB Output is correct
8 Failed 3 ms 3540 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3412 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 3 ms 3540 KB Output is correct
4 Correct 11 ms 4176 KB Output is correct
5 Correct 21 ms 4940 KB Output is correct
6 Correct 2 ms 3412 KB Output is correct
7 Failed 2 ms 3452 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3412 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 2 ms 3412 KB Output is correct
4 Correct 3 ms 3540 KB Output is correct
5 Correct 11 ms 4240 KB Output is correct
6 Correct 2 ms 3412 KB Output is correct
7 Correct 2 ms 3412 KB Output is correct
8 Failed 2 ms 3540 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3412 KB Output is correct
2 Failed 56 ms 5948 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
3 Halted 0 ms 0 KB -