Submission #893315

#TimeUsernameProblemLanguageResultExecution timeMemory
893315amirhoseinfar1385별자리 3 (JOI20_constellation3)C++17
0 / 100
1 ms6492 KiB
#include<bits/stdc++.h> using namespace std; const long long maxn=200000+10; struct node{ long long x,y,w,l,r; }allq[maxn]; long long all[maxn],q,n; vector<long long>sn,si; pair<long long,long long>val[maxn],fakeval[maxn]; bool cmpn(long long a,long long b){ return allq[a].y<allq[b].y; } bool cmpi(long long a,long long b){ if(all[a]==all[b]){ return a<b; } return all[a]<all[b]; } void callr() { for(long long i=1;i<=q;i++){ long long l=allq[i].x,r=allq[i].x; while(l!=0&&all[l]<allq[i].y){ l--; } while(r!=n+1&&all[r]<allq[i].y){ r++; } allq[i].l=l; allq[i].r=r; } } long long mainres=0; void updn(long long ind){ long long res=0,resa=0; int maxa=-1; for(long long i=allq[ind].x;i<allq[ind].r;i++){ //res=max(res,val[i].second); if(all[i]>maxa){ res+=val[i].second; maxa=all[i]; } } maxa=-1; for(long long i=allq[ind].x;i>allq[ind].l;i--){ //resa=max(resa,val[i].first); if(all[i]>maxa){ res+=val[i].first; maxa=all[i]; } } res+=resa+allq[ind].w; fakeval[allq[ind].r].first=max(fakeval[allq[ind].r].first,res); fakeval[allq[ind].l].second=max(fakeval[allq[ind].l].second,res); // cout<<ind<<" "<<allq[ind].l<<" "<<allq[ind].r<<" "<<res<<"\n"; mainres=max(mainres,res); } void upd(long long ind){ val[ind]=fakeval[ind]; // cout<<ind<<" "<<val[ind].first<<" "<<val[ind].second<<"\n"; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(long long i=1;i<=n;i++){ cin>>all[i]; si.push_back(i); } cin>>q; long long suma=0; for(long long i=1;i<=q;i++){ sn.push_back(i); cin>>allq[i].x>>allq[i].y>>allq[i].w; suma+=allq[i].w; } callr(); sort(sn.begin(),sn.end(),cmpn); sort(si.begin(),si.end(),cmpi); long long i=0,j=0; while(i<(long long)sn.size()&&j<(long long)si.size()){ if(allq[sn[i]].y<=all[si[j]]){ updn(sn[i]); i++; } else{ upd(si[j]); j++; } } while(i<(long long)sn.size()){ updn(sn[i]); i++; } while(j<(long long)si.size()){ upd(si[j]); j++; } long long now=(long long)si.size()-1; long long res=val[si[now]].second; while(now!=0&&all[si[now-1]]==all[si[now]]){ now--; res+=val[si[now]].second; } res+=val[si[now]].first; mainres=max(mainres,res); mainres=suma-mainres; cout<<mainres<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...