제출 #1328152

#제출 시각아이디문제언어결과실행 시간메모리
1328152wangzhiyi33별자리 3 (JOI20_constellation3)C++20
0 / 100
2 ms580 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back

const int maxn=2e5+3;
vector<int>adj[maxn+4];
int n;
int a[maxn+2],l[maxn+2],r[maxn+2];
int dp[maxn+2],bin[maxn+2][20];
vector<ii>isi[maxn+2];

int anc(int u,int mx){
    for(int q=19;q>=0;q--){
        if(a[bin[u][q]]<mx){
            u=bin[u][q];
        }
    }
    return u;
}

int cnt,in[maxn+2],out[maxn+2];

int st[4*maxn+2];

void update(int idx,int l,int r,int posl,int posr,int val){
    if(l>posr || r<posl)return;
    if(l>=posl && r<=posr){
        st[idx]+=val; return;
    }
    int mid=(l+r)/2;
    update(2*idx,l,mid,posl,posr,val); update(2*idx+1,mid+1,r,posl,posr,val);
}

int query(int idx,int l,int r,int pos){
    if(l>pos || r<pos)return 0;
    if(l==r){
        return st[idx];
    }
    int mid=(l+r)/2;
    return query(2*idx,l,mid,pos)+query(2*idx+1,mid+1,r,pos)+st[idx];
}

void dfs(int cur){
    //cout<<cur<<endl;
    in[cur]=++cnt;
    for(auto x : adj[cur]){
        dfs(x);
        dp[cur]+=dp[x];
    }
    out[cur]=cnt;

    update(1,1,n,in[cur],out[cur],dp[cur]);
    for(auto [id ,val] : isi[cur]){
        dp[cur]=max(dp[cur],val+query(1,1,n,in[id]));
    }
    update(1,1,n,in[cur],out[cur],-dp[cur]);
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;

    a[0]=a[n+1]=1e15;
    for(int q=1;q<=n;q++){
        cin>>a[q];
    }

    stack<int>st; st.push(0);
    for(int q=1;q<=n;q++){
        while(st.size() && a[st.top()]<a[q]){
            st.pop();
        }
        l[q]=st.top();
        st.push(q);
    }
    while(st.size())st.pop();
    st.push(n+1);

    for(int q=n;q>=1;q--){
        while(st.size() && a[st.top()]<=a[q]){
            st.pop();
        }
        r[q]=st.top();
        st.push(q);
    }

    for(int q=1;q<=n;q++){
        if(r[q]==n+1 || a[l[q]]<a[r[q]]){
            adj[l[q]].push_back(q);
            bin[q][0]=l[q];
        }
        else{
            adj[r[q]].push_back(q);
            bin[q][0]=r[q];
        }
    }

    for(int q=1;q<=19;q++){
        for(int w=1;w<=n;w++){
            bin[w][q]=bin[bin[w][q-1]][q-1];
        }
    }

    int brp; cin>>brp;
    int ans=0;
    while(brp--){
        int u,h,c;
        cin>>u>>h>>c;
        isi[anc(u,h)].pb({u,c});
        ans+=c;
    }

    dfs(0);
    cout<<ans-dp[0]<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...