| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1315727 | abcd123456 | Bulldozer (JOI17_bulldozer) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int MAXN = 2005;
const ld PI = acosl(-1.0L);
const ld EPS = 1e-12L;
int n;
ll X[MAXN], Y[MAXN], W[MAXN];
struct Node {
ll sum, pre, suf, best;
Node(ll v = 0) {
sum = v;
pre = suf = best = max(0LL, v);
}
};
Node st[4 * MAXN];
Node mergeNode(const Node &L, const Node &R) {
Node res;
res.sum = L.sum + R.sum;
res.pre = max(L.pre, L.sum + R.pre);
res.suf = max(R.suf, R.sum + L.suf);
res.best = max({L.best, R.best, L.suf + R.pre});
return res;
}
void build(int id, int l, int r, const vector<ll> &arr) {
if (l == r) {
st[id] = Node(arr[l]);
return;
}
int mid = (l + r) >> 1;
build(id<<1, l, mid, arr);
build(id<<1|1, mid+1, r, arr);
st[id] = mergeNode(st[id<<1], st[id<<1|1]);
}
void update(int id, int l, int r, int pos, ll val) {
if (l == r) {
st[id] = Node(val);
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update(id<<1, l, mid, pos, val);
else update(id<<1|1, mid+1, r, pos, val);
st[id] = mergeNode(st[id<<1], st[id<<1|1]);
}
struct Event {
ld ang;
int u, v;
bool operator<(const Event &o) const {
if (fabsl(ang - o.ang) > EPS) return ang < o.ang;
if (u != o.u) return u < o.u;
return v < o.v;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> X[i] >> Y[i] >> W[i];
vector<Event> ev;
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j) {
ld ang = atan2l((ld)(Y[j] - Y[i]), (ld)(X[j] - X[i]));
if (ang < 0) ang += PI;
ev.push_back({ang, i, j});
}
sort(ev.begin(), ev.end());
vector<int> ord(n + 1), pos(n + 1);
iota(ord.begin(), ord.end(), 0);
sort(ord.begin() + 1, ord.end(), [&](int a, int b) {
if (X[a] != X[b]) return X[a] < X[b];
return Y[a] < Y[b];
});
for (int i = 1; i <= n; ++i)
pos[ord[i]] = i;
vector<ll> arr(n + 1);
for (int i = 1; i <= n; ++i)
arr[i] = W[ord[i]];
build(1, 1, n, arr);
ll ans = st[1].best;
for (size_t i = 0; i < ev.size(); ) {
size_t j = i;
while (j < ev.size() && fabsl(ev[j].ang - ev[i].ang) <= EPS) ++j;
vector<pair<int,int>> sw;
for (size_t k = i; k < j; ++k) {
int u = ev[k].u, v = ev[k].v;
int pu = pos[u], pv = pos[v];
if (pu == pv) continue;
if (pu > pv) swap(pu, pv);
sw.emplace_back(pu, pv);
}
sort(sw.begin(), sw.end());
sw.erase(unique(sw.begin
