제출 #717762

#제출 시각아이디문제언어결과실행 시간메모리
717762ToxtaqArt Exhibition (JOI18_art)C++17
100 / 100
252 ms95960 KiB
#include<bits/stdc++.h>
using namespace std;
vector<int>LOG;
struct SparseTable{
    vector<vector<long long>>sTable;
    SparseTable(int n, vector<long long>&v){
        sTable.resize(LOG[n] + 1);
        for(int i = 0;i <= LOG[n];++i)sTable[i].resize(n + 1);
        for(int i = 1;i <= n;++i){
            sTable[0][i] = v[i];
        }
        for(int i = 1;i <= LOG[n];++i){
            for(int j = 1;j + (1 << (i - 1)) <= n;++j){
                sTable[i][j] = max(sTable[i - 1][j], sTable[i - 1][j + (1 << (i - 1))]);
            }
        }
    }
    long long Query(int l, int r){
        int lg = LOG[r - l + 1];
        return max(sTable[lg][l], sTable[lg][r - (1 << lg) + 1]);
    }
};
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    LOG.resize(n + 1);
    LOG[1] = 0;
    for(int i = 2;i <= n;++i)LOG[i] = LOG[i / 2] + 1;
    vector<pair<long long, long long>>arts(n + 1);
    for(int i = 1;i <= n;++i){
        cin >> arts[i].first >> arts[i].second;
    }
    sort(arts.begin(), arts.end());
    vector<long long>P(n + 1);
    for(int i = 1;i <= n;++i){
        P[i] = P[i - 1] + arts[i].second + arts[i - 1].first - arts[i].first;
//        cout << "P[" << i << "]=" << P[i] << '\n';
    }
    SparseTable table(n, P);
    long long mx = 0;
    for(int i = 1;i <= n;++i){
        long long P_max = table.Query(i, n);
        long long num = (P_max - P[i - 1]) - arts[i - 1].first + arts[i].first;
        mx = max(mx, num);
    }
    cout << mx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...