답안 #624699

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
624699 2022-08-08T15:47:01 Z Vladth11 Roads (CEOI20_roads) C++14
0 / 100
229 ms 15040 KB
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
 
using namespace std;
typedef long long ll;
typedef pair <long double, long double> pii;
 
const ll NMAX =200001;
const ll VMAX = 101;
const ll INF = 1e9;
const ll MOD = 1000000007;
const ll BLOCK = 447;
const ll base = 117;
const ll nr_of_bits = 18;
const ll inv2 = 500000004;
 
set <pii> exista;
 
struct event {
    pii x;
    int stare;
    bool operator < (const event a) {
        if(a.x.first != x.first) {
            return x.first < a.x.first;
        }
        if(a.stare != stare) {
            return stare > a.stare;
        }
        return x.second < a.x.second; /// Nu ar trb sa aiba importanta, dar e necesar sa nu busesc sortarea
    }
};
 
long double swipex;
 
struct segment {
    long double a, b, c, d;
    long double idx;
    long double gety() {
        if(c != a)
            return (long double)b + (long double)(swipex - a) * (long double)(d - b) / (long double)(c - a);
        else
            return (long double)b;
    }
} sgt[NMAX];
 
vector <event> events;
set <pii> already;
 
bool signs(long double a, long double b) {
    if(a < b)
        swap(a, b);
    if(a > 0 && b < 0)
        return 0;
    return 1;
}
 
long double cnt = 0;
 
void adauga(int a, int b) {
    if(a < b)
        swap(a, b);
    cnt++;
    segment first = sgt[a];
    segment second = sgt[b];
    if(first.a < second.a) {
        swap(first, second);
    } else if(first.a == second.a) {
        if(first.b < second.b) {
            swap(first, second);
        }
    } if(first.a >= second.c) {
        cout << (int)first.a << " " << (int)first.b << " " << (int)second.c << " " << (int)second.d << "\n";
        return;
    }
    if(second.a >= first.c) {
        cout <<(int)first.c << " " << (int)first.d << " " << (int)second.a << " " << (int)second.b << "\n";
        return;
    }
    cout << (int)first.a << " " << (int)first.b << " " << (int)second.a << " " << (int)second.b << "\n";
}
 
struct ura {
    long double first;
    int second;
    bool operator < (const ura a)const {
        if(a.second == -1 && second == -1) {
            return first < a.first;
        }
        if(a.second == -1) {
            return sgt[second].gety() < a.first;
        }
        if(second == -1) {
            return first < sgt[a.second].gety();
        }
        return sgt[second].gety() < sgt[a.second].gety();
    }
};
 
pii up[NMAX], down[NMAX];
 
int main() {
    //ifstream cin(".out");
    //ofstream cout(".out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, i;
    cin >> n;
    for(i = 1; i <= n; i++) {
        long double a, b, c, d;
        cin >> a >> b >> c >> d;
        if(a > c) {
            swap(b, d);
            swap(a, c);
        } else if(a == c) {
            if(b > d)
                swap(b, d); /// nu stiu daca e nevoie
        }
        sgt[i] = {a, b, c, d, i};
        exista.insert({a, b});
        exista.insert({c, d});
        events.push_back({{a, b}, i});
        events.push_back({{c, d}, -i});
    }
    n += 2;
    sgt[n - 1] = {-INF, -INF, INF, -INF, n - 1};
    events.push_back({{-INF, -INF}, n - 1});
    events.push_back({{INF, -INF}, -(n - 1)});
    sgt[n] = {-INF, INF, INF, INF, n};
    events.push_back({{-INF, INF}, n});
    events.push_back({{INF, INF}, -n});
    sort(events.begin(), events.end());
    set <ura> active;
    for(long double i = 0; i < events.size(); i++) {
        swipex = events[i].x.first;
        if(events[i].stare > 0) {
            active.insert({events[i].x.second, events[i].stare});
        } else {
            if(-events[i].stare < n - 1) {
                auto sus = active.lower_bound({sgt[-events[i].stare].gety(), -1});
                sus = prev(sus);
                auto jos = active.lower_bound({sgt[-events[i].stare].gety(), -1});
                jos = next(jos);
                int indS = (*sus).second;
                int indJ = (*jos).second;
                down[indS] = {swipex, -events[i].stare};
                up[indJ] = {swipex, -events[i].stare};
            }
            active.erase({events[i].x.second, -events[i].stare});
            continue;
        }
        if(events[i].stare > n - 2) continue;
        pair <pii, int> x = {events[i].x, events[i].stare};
        auto sus = active.lower_bound({x.first.second, -1});
        sus = prev(sus);
        auto jos = active.lower_bound({x.first.second, -1}); /// nu vrem daca trece chiar la limita sa-l ignor
        jos = next(jos);
        int indS = (*sus).second;
        int indJ = (*jos).second;
        pii maxim = max(down[indS], up[indJ]);
        if(maxim.second < n - 1 && maxim.second != 0){
            cout << x.first.first << " " << x.first.second << " ";
            pii doilea;
            if(maxim.first != sgt[(int)maxim.second].a){                doilea = {sgt[(int)maxim.second].c, sgt[(int)maxim.second].d};

            }else{                doilea = {sgt[(int)maxim.second].a, sgt[(int)maxim.second].b};

            }
            cout << doilea.first << " " << doilea.second << "\n";
        }
        up[indJ] = {swipex, x.second};
        down[indS] = {swipex, x.second};
        up[x.second] = {swipex, x.second};
        down[x.second] = {swipex, x.second};
    }
    //assert(cnt == n - 3);
    return 0;
 
}

Compilation message

roads.cpp: In function 'int main()':
roads.cpp:120:31: warning: narrowing conversion of 'i' from 'int' to 'long double' [-Wnarrowing]
  120 |         sgt[i] = {a, b, c, d, i};
      |                               ^
roads.cpp:127:44: warning: narrowing conversion of '(n - 1)' from 'int' to 'long double' [-Wnarrowing]
  127 |     sgt[n - 1] = {-INF, -INF, INF, -INF, n - 1};
      |                                          ~~^~~
roads.cpp:130:36: warning: narrowing conversion of 'n' from 'int' to 'long double' [-Wnarrowing]
  130 |     sgt[n] = {-INF, INF, INF, INF, n};
      |                                    ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 220 ms 15040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Failed 5 ms 724 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Failed 6 ms 724 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Failed 5 ms 764 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Failed 5 ms 724 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 229 ms 14980 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Failed 5 ms 724 KB Condition failed: "pf == Sline.end() || !Cross(S[*pi], S[*pf])"
6 Halted 0 ms 0 KB -