답안 #73200

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
73200 2018-08-28T04:09:36 Z test 오르막길 (FXCUP3_hill) C++14
0 / 100
4 ms 432 KB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int MN = 300010;

ll cross(pii a, pii b) {
    return 1LL * a.first * b.second - 1LL * a.second * b.first;
}
ll ccw(pii a, pii b, pii c) {
    pii p = pii(b.first - a.first, b.second - a.second);
    pii q = pii(c.first - a.first, c.second - a.second);
    return cross(p, q);
}

int gcd(int a, int b) {
    return b? gcd(b, a % b) : a;
}

int N;
ll C;
pii P[MN];

struct frac {
    int a, b;
    pii p;
    bool operator <(const frac &i) const {
        return 1LL * b * i.a < 1LL * a * i.b || (1LL * b * i.a == 1LL * a * i.b && p < i.p);
    }
};
priority_queue<frac> pq;
set<pii> pp;

int main() {
    scanf("%d %lld", &N, &C);
    C *= 2;

    for(int i = 0; i < N; i++) {
        scanf("%d", &P[i].first);
    }
    for(int i = 0; i < N; i++) {
        scanf("%d", &P[i].second);
    }

    for(int i = 0; i < N - 1; i++) {
        pq.push({ P[i + 1].first - P[i].first, P[i + 1].second - P[i].second, P[i] });
    }
    for(int i = 0; i < N; i++) {
        pp.insert(P[i]);
    }

    while(1) {
        frac t = pq.top();
        pii cur = t.p;
        pp.erase(cur);

        set<pii>::iterator it = pp.lower_bound(cur);
        if(it == pp.begin()) break;

        pii nxt = *it;
        pii pre = *(--it);

        ll need = abs(ccw(pre, cur, nxt));
        if(need > C) break;
        C -= need;

        pq.pop();
        pq.push({ nxt.first - pre.first, nxt.second - pre.second, pre });
    }

    frac t = pq.top();
    int A = t.a;
    int B = t.b;
    int G = gcd(A, B);
    A /= G;
    B /= G;
    printf("%d/%d", B, A);
}

Compilation message

hill.cpp: In function 'int main()':
hill.cpp:37:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %lld", &N, &C);
     ~~~~~^~~~~~~~~~~~~~~~~~~
hill.cpp:41:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &P[i].first);
         ~~~~~^~~~~~~~~~~~~~~~~~~
hill.cpp:44:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &P[i].second);
         ~~~~~^~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 248 KB Output is correct
2 Correct 3 ms 356 KB Output is correct
3 Correct 3 ms 432 KB Output is correct
4 Incorrect 4 ms 432 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 248 KB Output is correct
2 Correct 3 ms 356 KB Output is correct
3 Correct 3 ms 432 KB Output is correct
4 Incorrect 4 ms 432 KB Output isn't correct
5 Halted 0 ms 0 KB -