제출 #442674

#제출 시각아이디문제언어결과실행 시간메모리
442674valerikkBulldozer (JOI17_bulldozer)C++17
100 / 100
957 ms55620 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long double ld;

const int S = 1 << 11;
const int N = S + 7;

struct event {
    ll x, y;
    int i, j;
};

bool operator<(const event &l, const event &r) {
    return l.x * r.y - l.y * r.x < 0;
}

bool operator==(const event &l, const event &r) {
    return l.x * r.y - l.y * r.x == 0;
}

int n;
ll x[N], y[N], w[N];
int ord[N];
ll sum[2 * S];
ll mx[2 * S];
ll pref[2 * S], suff[2 * S];
int where[N];
vector<event> events;

void init(int i, ll val) {
    i += S;
    sum[i] = val;
    mx[i] = pref[i] = suff[i] = max(0ll, val);
}

void recalc(int i) {
    int l = i << 1, r = i << 1 | 1;
    sum[i] = sum[l] + sum[r];
    mx[i] = max({mx[l], mx[r], suff[l] + pref[r]});
    pref[i] = max(pref[l], sum[l] + pref[r]);
    suff[i] = max(suff[r], sum[r] + suff[l]);
}

void build() {
    for (int i = 0; i < S; i++) init(i, 0);
    for (int i = 0; i < n; i++) init(i, w[ord[i]]);
    for (int i = S - 1; i > 0; i--) recalc(i);
}

void upd(int i, ll val) {
    init(i, val);
    i += S;
    while (i > 1) {
        i >>= 1;
        recalc(i);
    }
}

ll get() {
    return mx[1];
}

void my_swap(int i, int j) {
    int pi = where[i], pj = where[j];
    upd(pi, w[j]);
    upd(pj, w[i]);
    swap(ord[where[i]], ord[where[j]]);
    swap(where[i], where[j]);
}

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x[i] >> y[i] >> w[i];
    }
    for (int i = 0; i < n; i++) ord[i] = i;
    sort(ord, ord + n, [&](const int &i, const int &j) {
        return x[i] < x[j] || (x[i] == x[j] && y[i] > y[j]);
    });
    for (int i = 0; i < n; i++) where[ord[i]] = i;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            ll dx = x[i] - x[j], dy = y[i] - y[j];
            dy *= -1;
            swap(dx, dy);
            if (dy < 0 || (dy == 0 && dx < 0)) {
                dx *= -1;
                dy *= -1;
            }
            events.push_back({dx, dy, i, j});
        }
    }
    sort(events.begin(), events.end());
    build();
    ll ans = get();
    int i = 0;
    while (i < events.size()) {
        int j = i;
        while (j < events.size() && events[j] == events[i]) j++;
        vector<int> arr;
        for (int k = i; k < j; k++) arr.push_back(min(where[events[k].i], where[events[k].j]));
        sort(arr.begin(), arr.end());
        arr.erase(unique(arr.begin(), arr.end()), arr.end());
        int k = 0;
        while (k < arr.size()) {
            int l = k;
            while (l + 1 < arr.size() && arr[l + 1] == arr[l] + 1) l++;
            int L = arr[k], R = arr[l] + 1;
            for (int t = 0; L + t < R - t; t++) my_swap(ord[L + t], ord[R - t]);
            k = l + 1;
        }
        ans = max(ans, get());
        i = j;
    }
    cout << ans << endl;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bulldozer.cpp: In function 'int main()':
bulldozer.cpp:104:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |     while (i < events.size()) {
      |            ~~^~~~~~~~~~~~~~~
bulldozer.cpp:106:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |         while (j < events.size() && events[j] == events[i]) j++;
      |                ~~^~~~~~~~~~~~~~~
bulldozer.cpp:112:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         while (k < arr.size()) {
      |                ~~^~~~~~~~~~~~
bulldozer.cpp:114:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |             while (l + 1 < arr.size() && arr[l + 1] == arr[l] + 1) l++;
      |                    ~~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...