Submission #1144305

#TimeUsernameProblemLanguageResultExecution timeMemory
1144305thecrazycandyArt Exhibition (JOI18_art)C++20
100 / 100
457 ms32564 KiB
#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
using namespace std;
#define sped_up ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
const ll INF = (ll)1e9 + 1, INFL = (ll)1e18 + 1;
const ll mod = (ll)1e9 + 7, MAXN = (ll)5e5 + 1;
pair <ll, ll> t[MAXN * 4];
vector <pair <ll, ll>> v1;
ll a[MAXN], b[MAXN];
void build (ll v, ll tl, ll tr) {
    if (tl == tr) {
        t[v] = {0, v1[tl - 1].first};
        return;
    }
    ll tm = (tl + tr) / 2;
    build (v * 2, tl, tm);
    build (v * 2 + 1, tm + 1, tr);
    if (t[v * 2].first + t[v * 2].second > t[v * 2 + 1].first + t[v * 2 + 1].second) t[v] = t[v * 2];
    else t[v] = t[v * 2 + 1];
}
pair <ll, ll> get (ll v, ll tl, ll tr, ll l, ll r) {
    if (l <= tl && tr <= r) return t[v];
    if (l > tr || tl > r) return {-INFL, 0};
    ll tm = (tl + tr) / 2;
    pair <ll, ll> a = get (v * 2, tl, tm, l, r);
    pair <ll, ll> b = get (v * 2 + 1, tm + 1, tr, l, r);
    if (a.first + a.second > b.first + b.second) return a;
    else return b;
}
void upd (ll v, ll tl, ll tr, ll pos, ll val) {
    if (tl == tr) {
        t[v].first = val;
        return;
    }
    ll tm = (tl + tr) / 2;
    if (pos <= tm) upd (v * 2, tl, tm, pos, val);
    else upd (v * 2 + 1, tm + 1, tr, pos, val);
    if (t[v * 2].first + t[v * 2].second > t[v * 2 + 1].first + t[v * 2 + 1].second) t[v] = t[v * 2];
    else t[v] = t[v * 2 + 1];
}
int main () {
    ll n;
    cin >> n;
    vector <pair <ll, ll>> v;
    for (int i = 1; i <= n; i++) {
        ll a, b;
        cin >> a >> b;
        v.push_back({a, b});
    }
    sort (v.begin(), v.end());
    ll cnt = v[0].second;
    for (int i = 1; i < v.size(); i++) {
        if (v[i].first == v[i - 1].first) cnt += v[i].second;
        else {
            v1.push_back({v[i - 1].first, cnt});
            cnt = v[i].second;
        }
    }
    ll mx = 0;
    v1.push_back({v[v.size() - 1].first, cnt});
    build (1, 1, v1.size());
    for (int i = 0; i < v1.size(); i++) {
        pair <ll, ll> gt = get(1, 1, v1.size(), 1, i + 1);
        mx = max(mx, gt.first + v1[i].second - v1[i].first + gt.second);
        upd(1, 1, v1.size(), i + 1, gt.first + v1[i].second - v1[i].first + gt.second);
    }
    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...