Submission #265444

#TimeUsernameProblemLanguageResultExecution timeMemory
265444islingrBulldozer (JOI17_bulldozer)C++17
100 / 100
1523 ms108280 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1 << 12; using ll = int64_t; struct S { ll pref, suff, ans, sum; S(ll x = 0) : sum{x} { ans = pref = suff = x > 0 ? x : 0; } S(const S &l, const S &r) : ans{max(l.ans, r.ans)} { pref = max(l.pref, l.sum + r.pref); suff = max(l.suff + r.sum, r.suff); ans = max(ans, l.suff + r.pref); sum = l.sum + r.sum; } } t[N << 1]; int sz = 1; void update(int p, ll x) { for (t[p += sz] = x; p >>= 1; ) t[p] = {t[p << 1], t[p << 1|1]}; } #define rep(i, a, b) for (auto i = (a); i < (b); ++i) #define all(x...) begin(x), end(x) ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } using point = complex<ll>; ll cross(const point &a, const point &b) { return imag(conj(a) * b); } int w[N], ord[N], pos[N]; point p[N]; vector<int> g[N], line; bool vis[N]; void dfs(int u) { vis[u] = 1; line.push_back(u); for (int v : g[u]) if (!vis[v]) dfs(v); } pair<point, pair<int, int>> m[N * N]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; while (sz < n) sz <<= 1; rep(i, 0, n) { int x, y; cin >> x >> y >> w[i]; p[i] = {x, y}; ord[i] = i; } sort(ord, ord + n, [&](int a, int b) { return pair(imag(p[a]), -real(p[a])) < pair(imag(p[b]), -real(p[b])); }); rep(i, 0, n) pos[ord[i]] = i; rep(i, 0, n) update(pos[i], w[i]); int c = 0; rep(i, 0, n) { rep(j, i + 1, n) { point z = p[i] - p[j]; ll g = gcd(real(z), imag(z)); assert(g != 0); z = {real(z) / g, imag(z) / g}; if (imag(z) <= 0) z = -z; m[c++] = {z, {i, j}}; m[c++] = {z, {j, i}}; } } sort(m, m + c, [&](auto a, auto b) { return cross(a.first, b.first) > 0; }); ll ans = t[1].ans; for (int i = 0, j = 0; i < c; i = j) { while (j < c && m[i].first == m[j].first) ++j; rep(k, i, j) g[m[k].second.first].push_back(m[k].second.second); rep(k, i, j) { if (vis[m[k].second.first]) continue; line.clear(); dfs(m[k].second.first); sort(all(line), [&](int x, int y) { return pos[x] < pos[y];}); int s = line.size(); for (int i = 0; i < s - i - 1; ++i) swap(pos[line[i]], pos[line[s - i - 1]]); for (int i : line) update(pos[i], w[i]); } ans = max(ans, t[1].ans); rep(k, i, j) g[m[k].second.first].clear(), vis[m[k].second.first] = 0; } 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...