Submission #118172

#TimeUsernameProblemLanguageResultExecution timeMemory
118172IOrtroiiiBulldozer (JOI17_bulldozer)C++14
100 / 100
1247 ms32480 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2020;

using ll = long long;

struct Point {
   int x, y, w;
   Point(int x = 0, int y = 0, int w = 0) : x(x), y(y), w(w) {}
   bool operator < (const Point &p) const {
      return x < p.x || (x == p.x && y < p.y);
   }
   Point operator - (const Point &p) const {
      return Point(x - p.x, y - p.y);
   }
   ll cross(const Point &p) const {
      return (ll) x * p.y - (ll) y * p.x;
   }
};

int n;
Point a[N];
int pos[N];

ll ccw(pair<int, int> u, pair<int, int> v) {
   Point p = a[u.second] - a[u.first];
   Point q = a[v.second] - a[v.first];
   return p.cross(q);
}

struct State {
   ll sum, pref, suf, val;
   State(int x = 0) {
      sum = (ll) x;
      pref = suf = val = (ll) max(x, 0);
   };
   friend State operator + (const State &l, const State &r) {
      State ans;
      ans.sum = l.sum + r.sum;
      ans.pref = max(l.pref, l.sum + r.pref);
      ans.suf = max(r.suf, r.sum + l.suf);
      ans.val = max({l.val, r.val, l.suf + r.pref});
      return ans;
   }
};

State t[N << 2];

#define mid ((l + r) >> 1)

void modify(int v, int l, int r, int pos, int val) {
   if (l == r) {
      t[v] = State(val);
      return;
   }
   if (pos <= mid) {
      modify(v << 1, l, mid, pos, val);
   } else {
      modify(v << 1 | 1, mid + 1, r, pos, val);
   }
   t[v] = t[v << 1] + t[v << 1 | 1];
}

int main() {
   ios_base::sync_with_stdio(false);
   cin >> n;
   for (int i = 1; i <= n; ++i) {
      cin >> a[i].x >> a[i].y >> a[i].w;
   }
   sort(a + 1, a + n + 1);
   vector<pair<int, int>> vals;
   for (int i = 1; i <= n; ++i) {
      for (int j = i + 1; j <= n; ++j) {
         vals.emplace_back(i, j);
      }
   }
   sort(vals.begin(), vals.end(), [&](pair<int, int> u, pair<int, int> v) {
      ll cur = ccw(u, v);
      if (cur) {
         return cur < 0;
      } else {
         return u < v;
      }
   });
   for (int i = 1; i <= n; ++i) {
      pos[i] = i;
      modify(1, 1, n, i, a[i].w);
   }
   ll ans = t[1].val;
   for (int i = 0; i < (int) vals.size(); ++i) {
      vector<pair<int, int>> sw(1, vals[i]);
      while (i + 1 < (int) vals.size() && !ccw(vals[i], vals[i + 1])) {
         sw.emplace_back(vals[++i]);
      }
      for (auto p : sw) {
         int u, v;
         tie(u, v) = p;
         swap(pos[u], pos[v]);
         modify(1, 1, n, pos[u], a[u].w);
         modify(1, 1, n, pos[v], a[v].w);
      }
      ans = max(ans, t[1].val);
   }
   cout << ans << '\n';
}
#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...