답안 #927327

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
927327 2024-02-14T18:06:35 Z DAleksa Bulldozer (JOI17_bulldozer) C++17
0 / 100
17 ms 856 KB
#include <bits/stdc++.h>

using namespace std;

struct point {
    int x;
    int y;
    int w;
};

struct frac {
    int p;
    int q;
    frac() { }
    frac(int _p, int _q) { p = _p; q = _q; }
};

bool operator < (frac a, frac b) {
    return a.p * b.q < b.p * a.q;
}

const int N = 105;
int n;
point a[N];
map<frac, vector<pair<int, int>>> buc;
vector<frac> slopes;
int order[N], pos[N];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y >> a[i].w;
    for(int i = 1; i <= n; i++) {
        for(int j = i + 1; j <= n; j++) {
            int sign = 1;
            int dx = a[i].x - a[j].x, dy = a[i].y - a[j].y;
            if(dx < 0) sign *= -1;
            if(dy < 0) sign *= -1;
            dx = abs(dx);
            dy = abs(dy);
            int g = __gcd(dx, dy);
            dx /= g;
            dy /= g;
            if(dx != 0) dy *= sign;
            if(a[i].x == a[j].x) {
                if(a[i].y > a[j].y) buc[frac(dy, dx)].emplace_back(i, j);
                else buc[frac(dy, dx)].emplace_back(j, i);
            } else {
                if(a[i].x < a[j].x) buc[frac(dy, dx)].emplace_back(i, j);
                else buc[frac(dy, dx)].emplace_back(j, i);
            }
            slopes.push_back(frac(dy, dx));
        }
    }
    sort(slopes.begin(), slopes.end(), [&](frac a, frac b) {
        return a.p * b.q < b.p * a.q;
    });
    for(int i = 1; i <= n; i++) order[i] = i;
    sort(order + 1, order + n + 1, [&](int i, int j) {
        if(a[i].x == a[j].x) return a[i].y > a[j].y;
        return a[i].x < a[j].x;
    });
    for(int i = 1; i <= n; i++) pos[order[i]] = i;
    long long ans = 0;
    for(frac slope : slopes) {
        long long mx = 0;
        for(int i = 1; i <= n; i++) mx = max((long long)a[order[i]].w, a[order[i]].w + mx);
        ans = max(ans, mx);
        for(pair<int, int> p : buc[slope]) {
            int i = p.first, j = p.second;
            if(pos[i] < pos[j]) {
                swap(order[pos[i]], order[pos[j]]);
                swap(pos[i], pos[j]);
            }
        }
    }
    {
        long long mx = 0;
        for(int i = 1; i <= n; i++) mx = max((long long)a[order[i]].w, a[order[i]].w + mx);
        ans = max(ans, mx);
    }
    cout << ans;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 17 ms 604 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 856 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 856 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 856 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 17 ms 604 KB Output isn't correct
2 Halted 0 ms 0 KB -