제출 #795236

#제출 시각아이디문제언어결과실행 시간메모리
795236vjudge1Team Contest (JOI22_team)C++17
64 / 100
195 ms13136 KiB
#include<bits/stdc++.h>

using namespace std;


struct person {
    int x, y, z;
};

const int N = 150000;

int w[300 + 10][300 + 10];

void add(int A, int B) {
    w[A][B] = max(w[A][B], A + B);
}
void build() {
    for(int i = 300; i >= 0; i--) {
        for(int j = 300; j >= 0; j--) {
            w[i][j] = max({w[i][j + 1], w[i + 1][j], w[i][j]});
        }
    }
}

vector<pair<int, int>> pnts[N + 10];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    vector<person> a(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i].x >> a[i].y >> a[i].z;
    }
    if(n <= 4000) {
        sort(a.begin(), a.end(), [](person l, person r) {return l.z < r.z;});
        int ans = 0;
        for(int i = 0; i < n; i++) {
            // cout << a[i].x << ' ' << a[i].y << ' ' << a[i].z << '\n';
            int Y = 0, l = i + 1;
            for(int j = i + 1; j < n; j++) {
                if(a[j].x >= a[i].x || a[j].z == a[i].z) continue;
                while (a[l].z < a[j].z) {
                    if(a[l].x < a[i].x) Y = max(Y, a[l].y);
                    l++;
                }

                if(Y > max(a[i].y, a[j].y)) {
                    ans = max(ans, a[i].x + Y + a[j].z);
                }
            }
            int X = 0, r = i + 1;
            for(int j = i + 1; j < n; j++) {
                if(a[j].y >= a[i].y || a[j].z == a[i].z) continue;
                while (a[r].z < a[j].z) {
                    if(a[r].y < a[i].y) X = max(X, a[r].x);
                    r++;
                }

                if(X > max(a[i].x, a[j].x)) {
                    ans = max(ans, a[i].y + X + a[j].z);
                }
            }

        }
        if(ans == 0) ans = -1;
        cout << ans;
        return 0;
    }
    sort(a.begin(), a.end(), [](person l, person r) {return l.x < r.x;});
    
    int mxZ[300 + 10] = {}, mxY[300 + 10] = {};
    for(int i = 0; i < n; i++) {
        mxY[a[i].z] = max(mxY[a[i].z], a[i].y);
        mxZ[a[i].y] = max(mxZ[a[i].y], a[i].z);
        for(int j = a[i].z + 1; j <= 300; j++) 
            mxY[j] = max(mxY[j], mxY[j - 1]);
        for(int j = a[i].y + 1; j <= 300; j++) 
            mxZ[j] = max(mxZ[j], mxZ[j - 1]);
        if(mxZ[a[i].y - 1] > a[i].z) 
            pnts[i].push_back({a[i].y, mxZ[a[i].y - 1]});
        if(mxY[a[i].z - 1] > a[i].y) 
            pnts[i].push_back({mxY[a[i].z - 1], a[i].z});
    }
    int res = 0;
    int l = 0;
    for(int i = 0; i < n; i++) {
        while(a[l].x < a[i].x) {
            for(auto [A, B] : pnts[l]) {
                add(A, B);
            }
            l++;
        }
        if(i && a[i].x != a[i - 1].x) build();
        if(w[a[i].y + 1][a[i].z + 1]) 
            res = max(a[i].x + w[a[i].y + 1][a[i].z + 1], res);
    }
    if(res == 0) cout << -1;
    else cout << res;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...