Submission #927345

# Submission time Handle Problem Language Result Execution time Memory
927345 2024-02-14T18:38:09 Z DAleksa Bulldozer (JOI17_bulldozer) C++17
0 / 100
586 ms 1068 KB
#include <bits/stdc++.h>

using namespace std;

struct point {
    int x;
    int y;
    int w;
    bool operator < (point p) {
        if(x == p.x) return y > p.y;
        return x < p.x;
    }
};

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

struct node {
    long long mx;
    long long pref;
    long long suff;
    long long sum;
};

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

const int N = 2010;
int n;
point a[N];
map<frac, vector<pair<int, int>>> buc;
vector<frac> slopes;
int order[N], pos[N];
node st[4 * N];

void update(int index, int l, int r, int x, int val) {
    if(l > r || r < x || x < l) return;
    if(l == r) {
        st[index].mx = st[index].pref = st[index].suff = max(val, 0);
        st[index].sum = val;
        return;
    }
    int mid = (l + r) / 2;
    update(2 * index, l, mid, x, val);
    update(2 * index + 1, mid + 1, r, x, val);
    st[index].mx = st[2 * index].suff + st[2 * index + 1].pref;
    st[index].pref = max(st[2 * index].pref, st[2 * index].sum + st[2 * index + 1].pref);
    st[index].suff = max(st[2 * index + 1].suff, st[2 * index + 1].sum + st[2 * index].suff);
    st[index].sum = st[2 * index].sum + st[2 * index + 1].sum;
}

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] < a[j]) 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 * 1LL * b.q < b.p * 1LL * a.q;
    });
    for(int i = 1; i <= n; i++) order[i] = i;
    sort(order + 1, order + n + 1, [&](int i, int j) {
        return a[i] < a[j];
    });
    for(int i = 1; i <= n; i++) pos[order[i]] = i;
    for(int i = 1; i <= n; i++) update(1, 1, n, i, a[order[i]].w);
    long long ans = 0;
    for(frac slope : slopes) {
        ans = max(ans, st[1].mx);
        sort(buc[slope].begin(), buc[slope].end(), [&](pair<int, int> i, pair<int, int> j) {
            if(i.first == j.first) return a[i.second] < a[j.second];
            return a[i.first] < a[j.first];
        });
        for(pair<int, int> p : buc[slope]) {
            int i = p.first, j = p.second;
            if(pos[i] < pos[j]) {
                update(1, 1, n, pos[i], a[order[pos[j]]].w);
                update(1, 1, n, pos[j], a[order[pos[i]]].w);
                swap(order[pos[i]], order[pos[j]]);
                swap(pos[i], pos[j]);
            }
        }
    }
    ans = max(ans, st[1].mx);
    cout << ans;
    return 0;
}
# Verdict Execution time Memory Grader output
1 Incorrect 586 ms 636 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 856 KB Output is correct
2 Correct 4 ms 944 KB Output is correct
3 Correct 4 ms 1008 KB Output is correct
4 Correct 5 ms 1068 KB Output is correct
5 Correct 4 ms 860 KB Output is correct
6 Incorrect 4 ms 860 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 856 KB Output is correct
2 Correct 4 ms 944 KB Output is correct
3 Correct 4 ms 1008 KB Output is correct
4 Correct 5 ms 1068 KB Output is correct
5 Correct 4 ms 860 KB Output is correct
6 Incorrect 4 ms 860 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 856 KB Output is correct
2 Correct 4 ms 944 KB Output is correct
3 Correct 4 ms 1008 KB Output is correct
4 Correct 5 ms 1068 KB Output is correct
5 Correct 4 ms 860 KB Output is correct
6 Incorrect 4 ms 860 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 586 ms 636 KB Output isn't correct
2 Halted 0 ms 0 KB -