Submission #498498

#TimeUsernameProblemLanguageResultExecution timeMemory
498498600MihneaBulldozer (JOI17_bulldozer)C++17
0 / 100
5 ms1304 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Point { ll x; ll y; ll value; }; struct R { int sgn; ll up; ll down; int i; int j; }; R get(ll x, ll y) { R sol; ll g = __gcd(x, y); x /= g; y /= g; sol.sgn = +1; if (x < 0 && y < 0) { x *= -1; y *= -1; } if (x < 0 || y < 0) { sol.sgn = -1; } sol.up = abs(x); sol.down = abs(y); return sol; } bool operator < (R a, R b) { if (a.sgn != b.sgn) { return a.sgn < b.sgn; } if (a.sgn == -1) { swap(a, b); } return a.up * b.down < b.up * a.down; } bool initialCmp(Point a, Point b) { if (a.y == b.y) { return a.x < b.x; } return a.y < b.y; } const int N = 2000 + 7; int n; R panta[N][N]; Point points[N]; void sneakyHack() { for (int i = 1; i <= n; i++) { swap(points[i].x, points[i].y); } } int ord[N]; int inv[N]; int main() { bool isHome; isHome = true; isHome = false; if (isHome) { freopen ("input", "r", stdin); } else { ios::sync_with_stdio(0); cin.tie(0); } cin >> n; for (int i = 1; i <= n; i++) { cin >> points[i].x >> points[i].y >> points[i].value; } ll best = 0; for (int iteration = 1; iteration <= 2; iteration++) { sneakyHack(); sort(points + 1, points + n + 1, initialCmp); for (int i = 1; i <= n; i++) { ord[i] = i; inv[i] = i; for (int j = i + 1; j <= n; j++) { panta[i][j] = get(points[i].x - points[j].x, points[i].y - points[j].y); panta[i][j].i = i; panta[i][j].j = j; } } vector<R> all; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { all.push_back(panta[i][j]); } } stable_sort(all.begin(), all.end()); /// all[it] < all[it + 1] int l = 0; while (l < (int) all.size()) { int r = l; while (r + 1 < (int) all.size() && !(all[r] < all[r + 1])) { r++; } for (int it = l; it <= r; it++) { int i = all[it].i; int j = all[it].j; int pos_i = inv[i]; int pos_j = inv[j]; swap(ord[pos_i], ord[pos_j]); inv[ord[pos_i]] = pos_i; inv[ord[pos_j]] = pos_j; } long long current = 0; for (int i = 1; i <= n; i++) { current = max(0LL, current + points[ord[i]].value); best = max(best, current); } l = r + 1; } } cout << best << "\n"; return 0; }

Compilation message (stderr)

bulldozer.cpp: In function 'int main()':
bulldozer.cpp:79:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |     freopen ("input", "r", stdin);
      |     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...