Submission #146415

#TimeUsernameProblemLanguageResultExecution timeMemory
146415osaaateiasavtnlBulldozer (JOI17_bulldozer)C++14
80 / 100
1064 ms50220 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define ii pair <int, int> #define app push_back #define all(a) a.begin(), a.end() #define bp __builtin_popcount #define ll long long const int N = 2007; int n, ans = 0; struct Point { int x, y, c; bool operator < (Point p) { return (y < p.y) || (y == p.y && x > p.x); } } a[N]; namespace TREE { struct Node { int l, r, sum, ans; Node (int x) { sum = x; l = r = ans = max(0ll, x); } Node () {} }; Node merge(Node l, Node r) { Node ans; ans.sum = l.sum + r.sum; ans.l = max(l.l, l.sum + r.l); ans.r = max(r.r, r.sum + l.r); ans.ans = max(max(l.ans, r.ans), l.r + r.l); return ans; } Node tree[N << 2]; void build(int v, int tl, int tr) { if (tl == tr) { tree[v] = Node(a[tl].c); return; } int tm = (tl + tr) >> 1; build(v * 2 + 1, tl, tm); build(v * 2 + 2, tm + 1, tr); tree[v] = merge(tree[v * 2 + 1], tree[v * 2 + 2]); } void upd(int v, int tl, int tr, int p, int x) { if (tl == tr) { tree[v] = Node(x); return; } int tm = (tl + tr) >> 1; if (p <= tm) upd(v * 2 + 1, tl, tm, p, x); else upd(v * 2 + 2, tm + 1, tr, p, x); tree[v] = merge(tree[v * 2 + 1], tree[v * 2 + 2]); } void build() { build(0, 0, n - 1); } void upd(int p, int x) { upd(0, 0, n - 1, p, x); } void relax() { ans = max(ans, tree[0].ans); } }; struct Line { double ang; int i, j; bool operator < (Line l) { return ang < l.ang || (ang == l.ang && i < l.i) || (ang == l.ang && i == l.i && j < l.j); } }; int pos[N]; signed main() { #ifdef HOME freopen("input.txt", "r", stdin); #else ios_base::sync_with_stdio(0); cin.tie(0); #endif using namespace TREE; cin >> n; for (int i = 0; i < n; ++i) cin >> a[i].x >> a[i].y >> a[i].c; sort(a, a + n); build(); relax(); vector <Line> l; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { l.app({atan2(a[j].y - a[i].y, a[j].x - a[i].x), i, j}); } } for (int i = 0; i < n; ++i) pos[i] = i; sort(all(l)); int ptr = 0; while (ptr < l.size()) { auto ang = l[ptr].ang; while (ptr < l.size() && l[ptr].ang == ang) { auto &e = l[ptr]; upd(pos[e.i], a[e.j].c); upd(pos[e.j], a[e.i].c); swap(pos[e.i], pos[e.j]); ++ptr; } relax(); } cout << ans << '\n'; }

Compilation message (stderr)

bulldozer.cpp: In function 'int main()':
bulldozer.cpp:73:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while (ptr < l.size()) {
            ~~~~^~~~~~~~~~
bulldozer.cpp:75:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (ptr < l.size() && l[ptr].ang == ang) {
                ~~~~^~~~~~~~~~
#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...