제출 #1315728

#제출 시각아이디문제언어결과실행 시간메모리
1315728abcd123456Bulldozer (JOI17_bulldozer)C++20
0 / 100
2 ms956 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(), sw.end()), sw.end()); for (auto &p : sw) { int pu = p.first, pv = p.second; int a = ord[pu], b = ord[pv]; swap(ord[pu], ord[pv]); pos[a] = pv; pos[b] = pu; update(1, 1, n, pu, W[ord[pu]]); update(1, 1, n, pv, W[ord[pv]]); } ans = max(ans, st[1].best); i = j; } cout << ans << '\n'; return 0; }
#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...