제출 #146420

#제출 시각아이디문제언어결과실행 시간메모리
146420osaaateiasavtnlBulldozer (JOI17_bulldozer)C++14
100 / 100
1016 ms66612 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define double long double
#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, C = 1e9 + 7;
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); }
};
int cp(int x1, int y1, int x2, int y2) { return x1 * y2 - y1 * x2; }
struct Line {
    int x, y, i, j;
    bool operator < (Line l) { 
        int t = cp(x, y, l.x, l.y);
        return t > 0 || (t == 0 && i < l.i) || (t == 0 && 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; a[i].x += C; a[i].y += 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({a[j].x - a[i].x, a[j].y - a[i].y, i, j});
        }
    }
    for (int i = 0; i < n; ++i) pos[i] = i;
    sort(all(l));
    int ptr = 0;
    while (ptr < l.size()) {
        int t = ptr;
        while (ptr < l.size() && cp(l[t].x, l[t].y, l[ptr].x, l[ptr].y) == 0) {
            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';
}  

컴파일 시 표준 에러 (stderr) 메시지

bulldozer.cpp: In function 'int main()':
bulldozer.cpp:78:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while (ptr < l.size()) {
            ~~~~^~~~~~~~~~
bulldozer.cpp:80:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (ptr < l.size() && cp(l[t].x, l[t].y, l[ptr].x, l[ptr].y) == 0) {
                ~~~~^~~~~~~~~~
#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...