Submission #946969

#TimeUsernameProblemLanguageResultExecution timeMemory
946969PacybwoahConstellation 3 (JOI20_constellation3)C++17
100 / 100
342 ms30364 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include<set>
using namespace std;
typedef long long ll;
struct rng{
    ll val;
    int l,r,x,y;
    rng(ll _val,int _l,int _r,int _x,int _y){
        val=_val,l=_l,r=_r,x=_x,y=_y;
    }
};
bool operator< (const rng &a,const rng &b){
    return a.y<b.y;
}
vector<ll> bit;
void modify(int pos,ll num,int n){
    while(pos<=n){
        bit[pos]+=num;
        pos+=pos&-pos;
    }
}
ll quer(int pos){
    ll ans=0;
    while(pos>0){
        ans+=bit[pos];
        pos-=(pos&-pos);
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    ll ans=0;
    cin>>n;
    vector<int> h(n+1),bases(n+1,-1);
    bit.resize(n+1);
    for(int i=1;i<=n;i++) cin>>h[i];
    vector<vector<int>> st(19,vector<int>(n+1));
    for(int i=0;i<20;i++){
        for(int j=(1<<i);j<min(1<<(i+1),n+1);j++){
            if(bases[j]==-1) bases[j]=i;
        }
    }
    for(int i=1;i<=n;i++) st[0][i]=h[i];
    for(int i=1;i<19;i++){
        for(int j=1;j<=n;j++) st[i][j]=max(st[i-1][j],st[i-1][min(j+(1<<(i-1)),n)]);
    }
    auto query=[&](int l,int r){
        int len=bases[r-l+1];
        return max(st[len][l],st[len][r-(1<<len)+1]);
    };
    int m;
    ll c;
    cin>>m;
    vector<rng> vec;
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y>>c;
        ans+=c;
        int lh,rh,l=1,r=x;
        while(l<r){
            int mid=((l+r)>>1);
            if(query(mid,x)>=y) l=mid+1;
            else r=mid;
        }
        lh=l,l=x,r=n;
        while(l<r){
            int mid=((l+r)>>1)+1;
            if(query(x,mid)>=y) r=mid-1;
            else l=mid;
        }
        rh=l;
        vec.emplace_back(c,lh,rh,x,y);
    }
    sort(vec.begin(),vec.end());
    set<pair<int,int>> s;
    vector<ll> dp(m);
    int cnt=0;
    auto mod=[&](int l,int r,ll num){
        modify(l,num,n);
        modify(r+1,-num,n);
    };
    for(auto &[val,l,r,x,y]:vec){
        ll sum=0;
        while(!s.empty()){
            auto iter=s.lower_bound(make_pair(l,-1));
            if(iter==s.end()||(*iter).first>r) break;
            mod(vec[(*iter).second].l,vec[(*iter).second].r,-dp[(*iter).second]);
            sum+=dp[(*iter).second];
            s.erase(iter);
        }
        mod(l,r,sum);
        dp[cnt]=max(quer(x)+val,sum);
        cnt++;
        s.insert(make_pair(x,cnt-1));
    }
    for(auto [x,id]:s){
        ans-=dp[id];
    }
    //for(int i=0;i<m;i++) cout<<i<<" "<<vec[i].x<<" "<<vec[i].y<<' '<<dp[i]<<"\n";
    cout<<ans<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...