Submission #220625

#TimeUsernameProblemLanguageResultExecution timeMemory
220625PeppaPigBulldozer (JOI17_bulldozer)C++14
100 / 100
1006 ms33740 KiB
#include <bits/stdc++.h> #define long long long #define pii pair<long, long> #define x first #define y second using namespace std; const int N = 1 << 11; const long INF = 1e18; struct Point { int x, y, c; Point() {} Point(int x, int y, int c) : x(x), y(y), c(c) {} friend bool operator<(const Point &a, const Point &b) { return make_pair(pii(a.x, -a.y), a.c) < make_pair(pii(b.x, -b.y), b.c); } }; struct Line { int dx, dy, x, y; Line() {} Line(int dx, int dy, int x, int y) : dx(dx), dy(dy), x(x), y(y) {} friend bool operator<(const Line &a, const Line &b) { long d = 1ll * a.dy * b.dx - 1ll * b.dy * a.dx; if(d == 0) return pii(a.x, a.y) < pii(b.x, b.y); return d > 0; } }; int n, pos[N]; vector<Point> point; vector<Line> line; struct item { long pre, suf, sum, ans; item() : pre(-INF), suf(-INF), sum(-INF), ans(-INF) {} item(long x) : pre(x), suf(x), sum(x), ans(x) {} friend item operator+(const item &a, const item &b) { item ret; ret.pre = max(a.pre, a.sum + b.pre); ret.suf = max(b.suf, a.suf + b.sum); ret.sum = a.sum + b.sum; ret.ans = max({a.ans, b.ans, a.suf + b.pre}); return ret; } } t[N << 1]; void build(int p = 1, int l = 0, int r = n - 1) { if(l == r) return void(t[p] = item(point[l].c)); int mid = (l + r) >> 1; build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r); t[p] = t[p << 1] + t[p << 1 | 1]; } void update(int x, int k, int p = 1, int l = 0, int r = n - 1) { if(l == r) return void(t[p] = item(k)); int mid = (l + r) >> 1; if(x <= mid) update(x, k, p << 1, l, mid); else update(x, k, p << 1 | 1, mid + 1, r); t[p] = t[p << 1] + t[p << 1 | 1]; } int main() { iota(pos, pos + N, 0); scanf("%d", &n); point.resize(n); for(int i = 0; i < n; i++) scanf("%d %d %d", &point[i].x, &point[i].y, &point[i].c); sort(point.begin(), point.end()); for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) { if(point[i].x == point[j].x) continue; line.emplace_back(point[j].x - point[i].x, point[j].y - point[i].y, i, j); } sort(line.begin(), line.end()); build(); long ans = max(0ll, t[1].ans); for(int i = 0; i < line.size(); i++) { int a = line[i].x, b = line[i].y; update(pos[a], point[b].c), update(pos[b], point[a].c); swap(pos[a], pos[b]); if(i == line.size() - 1 || 1ll * line[i].dy * line[i + 1].dx != 1ll * line[i].dx * line[i + 1].dy) ans = max(ans, t[1].ans); } printf("%lld\n", ans); return 0; }

Compilation message (stderr)

bulldozer.cpp: In function 'int main()':
bulldozer.cpp:83:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < line.size(); i++) {
                    ~~^~~~~~~~~~~~~
bulldozer.cpp:89:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(i == line.size() - 1 || 1ll * line[i].dy * line[i + 1].dx != 1ll * line[i].dx * line[i + 1].dy)
            ~~^~~~~~~~~~~~~~~~~~
bulldozer.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
bulldozer.cpp:71:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i = 0; i < n; i++) scanf("%d %d %d", &point[i].x, &point[i].y, &point[i].c);
                                ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...