Submission #1077807

#TimeUsernameProblemLanguageResultExecution timeMemory
1077807danikoynovBulldozer (JOI17_bulldozer)C++14
20 / 100
2036 ms856 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; struct Point { ll x, y; Point(ll _x = 0, ll _y = 0) { x = _x; y = _y; } void input() { cin >> x >> y; } }; const int MAXN = 2010; int n; pair < Point, ll > spot[MAXN]; void input() { cin >> n; for (int i = 1; i <= n; i ++) { spot[i].first.input(); cin >> spot[i].second; } } ll signed_area(Point A, Point B, Point C) /// returns signed area * 2 { ll area = (B.x - A.x) * (A.y + B.y) + (C.x - B.x) * (B.y + C.y) + (A.x - C.x) * (C.y + A.y); return area; } int orient(Point A, Point B, Point C) { ll area = signed_area(A, B, C); if (area > 0) return 1; if (area < 0) return -1; assert(area != 0); return 0; } void simulate() { bool all_x = true; for (int i = 1; i <= n; i ++) if (spot[i].first.y != 0) all_x = false; ll result = 0; if (all_x) { for (int i = 1; i <= n; i ++) if (spot[i].second > 0) result += spot[i].second; cout << result << endl; return; } if (n == 1) { result = max(result, spot[1].second); } if (n == 2) { result = max(result, spot[1].second); result = max(result, spot[2].second); result = max(result, spot[1].second + spot[2].second); } for (int i = 1; i <= n; i ++) for (int j = i + 1; j <= n; j ++) { vector < pair < ll, ll > > pos, neg; for (int k = 1; k <= n; k ++) { if (k == i || k == j) continue; ll area = signed_area(spot[i].first, spot[j].first, spot[k].first); /**if (i == 3 && j == 4) { cout << "pair with " << k << " area " << area << " value " << spot[k].second << endl; }*/ assert(area != 0); if (area > 0) pos.push_back({area, spot[k].second}); else neg.push_back({-area, spot[k].second}); } sort(pos.begin(), pos.end()); sort(neg.begin(), neg.end()); ll best = 0, sum = 0; ll ls = -1; for (pair < ll, ll > cur : pos) { sum += cur.second; assert(cur.first != ls); ls = cur.first; best = max(best, sum); } ls = -1; sum = 0; for (pair < ll, ll > cur : neg) { sum += cur.second; assert(cur.first != ls); ls = cur.first; best = max(best, sum); } //cout << "HERE " << best << endl; best = best + spot[i].second; best = best + spot[j].second; //cout << "new best " << best << endl; //ll mx = min(spot[i].second, spot[j].second); //cout << "mx " << mx << endl; if (spot[i].second < 0) best -= spot[i].second; if (spot[j].second < 0) best -= spot[j].second; //cout << "pair " << i << " " << j << " " << best << endl; result = max(result, best); } cout << result << endl; } void solve() { input(); simulate(); } int main() { solve(); return 0; } /* 3 0 0 1 1 0 1 2 0 1 */
#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...