제출 #1152927

#제출 시각아이디문제언어결과실행 시간메모리
1152927pokmui9909별자리 3 (JOI20_constellation3)C++17
0 / 100
5 ms10048 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll N, M, A[200005], P[22][200005], Rt = 0;
vector<ll> C[200005];
vector<pair<ll, ll>> V[200005];

void Construct(){
    vector<ll> L(N + 1), R(N + 1);
    for(ll i = 1; i <= N; i++){
        ll p = i - 1;
        while(A[p] > A[i]) p = P[0][p];
        L[i] = R[p], R[p] = i, P[0][L[i]] = i, P[0][i] = p;
    }
    for(ll i = 1; i <= N; i++){
        if(P[0][i] == 0){
            Rt = i;
            P[0][i] = i;
        } else {
            C[P[0][i]].push_back(i);
        }
    }
    for(ll j = 1; j < 20; j++){
        for(ll i = 1; i <= N; i++){
            P[j][i] = P[j - 1][P[j - 1][i]];
        }
    }
}

struct SegTree{
    ll T[800005] = {};
    void upd(ll n, ll s, ll e, ll k, ll v){
        if(s == e){
            T[n] += v; return;
        }
        ll m = (s + e) / 2;
        if(k <= m) upd(n * 2, s, m, k, v);
        else upd(n * 2 + 1, m + 1, e, k, v);
        T[n] = T[n * 2] + T[n * 2 + 1];
    }
    ll qry(ll n, ll s, ll e, ll l, ll r){
        if(e < l || s > r) return 0;
        if(l <= s && e <= r) return T[n];
        ll m = (s + e) / 2;
        return qry(n * 2, s, m, l, r) + qry(n * 2 + 1, m + 1, e, l, r);
    }
}X, Y;

ll S[200005], In[200005], Out[200005], up[200005], dp[200005], Num = 0;

void init(ll u){
    for(auto v : C[u]){
        init(v); S[u] += S[v];
    }
}
void dcp(ll u){
    for(auto &v : C[u]){
        dcp(v);
        if(S[v] > S[C[u][0]]) swap(C[u][0], v);
    }
}
void hld(ll u){
    In[u] = ++Num;
    for(auto v : C[u]){
        up[v] = (v == C[u][0] ? up[u] : v);
        hld(v);
    }
    Out[u] = Num;
}

void cal(ll u){
    for(auto v : C[u]){
        cal(v);
        dp[u] += dp[v];
    }
    for(auto e : V[u]){
        ll v = e.first, c = e.second, Res = 0;
        while(up[u] != up[v]){
            Res += X.qry(1, 1, N, In[up[v]], In[v]) - Y.qry(1, 1, N, In[up[u]], In[v]);
            v = P[0][up[v]];
        }
        Res += X.qry(1, 1, N, In[u], In[v]) - Y.qry(1, 1, N, In[u], In[v]);
        dp[u] = max(dp[u], Res + c);
    }
    X.upd(1, 1, N, In[P[0][u]], dp[u]);
    Y.upd(1, 1, N, In[u], dp[u]);
}

int main(){
    cin.tie(0) -> sync_with_stdio(0);

    cin >> N;
    for(ll i = 1; i <= N; i++){
        cin >> A[i];
        A[i] = N - A[i];
    }
    Construct();
    init(Rt); dcp(Rt); hld(Rt);
    cin >> M;
    ll Sum = 0;
    for(ll i = 1; i <= M; i++){
        ll x, y, c; cin >> x >> y >> c;
        Sum += c;
        y = N + 1 - y;
        ll u = x;
        for(ll j = 19; j >= 0; j--){
            if(A[P[j][u]] >= y) u = P[j][u];
        }
        V[u].push_back({x, c});
    }
    cal(Rt);
    cout << Sum - dp[Rt];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...