제출 #736308

#제출 시각아이디문제언어결과실행 시간메모리
736308LCJLYFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
655 ms42816 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int,int>pii; inline int combine(int a, int b){ return a+b; } const int defval=0; #define lazyChange (e-s+1) struct node{ int s,e,m; node *l, *r; int v; int lazyUpd, lazySet; node(int ss, int ee):s(ss),e(ee),m((s+e)>>1),v(defval),lazyUpd(0){ if(s!=e){ l=new node(s,m); r=new node(m+1,e); } } inline int forceProp(){ if(s==e){ v+=lazyUpd; lazyUpd=0; return v; } if(lazyUpd!=0){ v+=lazyChange*lazyUpd,l->lazyUpd+=lazyUpd,r->lazyUpd+=lazyUpd,lazyUpd=0; } return v; } void rangeUpd(int first, int last, int c){ if(first<=s&&last>=e){ lazyUpd+=c; return; } forceProp(); if(first<=m)l->rangeUpd(first,last,c); if(last>m)r->rangeUpd(first,last,c); v=combine(l->forceProp(),r->forceProp()); } int query(int x, int y){ if(s==e){ v+=lazyUpd; lazyUpd=0; return v; } if(x<=s&&y>=e){ forceProp(); return v; } forceProp(); if(y<=m)return l->query(x,y); if(x>m)return r->query(x,y); return combine(l->query(x,m),r->query(m+1,y)); } }; int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); int n,q,s,t; cin >> n >> q >> s >> t; node st(0,n+5); //node ans(0,n+5); int ans[n+5]; memset(ans,0,sizeof(ans)); for(int x=0;x<=n;x++){ int temp; cin >> temp; st.rangeUpd(x,x,temp); } int counter=0; for(int x=1;x<=n;x++){ int hold=st.query(x,x); int hold2=st.query(x-1,x-1); if(hold2<hold){ //ans.rangeUpd(x,x,-1LL*s*abs(hold-hold2)); ans[x]=-1LL*s*abs(hold-hold2); } else{ //ans.rangeUpd(x,x,t*abs(hold-hold2)); ans[x]=t*abs(hold-hold2); } counter+=ans[x]; } int l,r,val; for(int x=0;x<q;x++){ cin >> l >> r >> val; st.rangeUpd(l,r,val); //changes //left //int hold=ans.query(l,l); int hold2=st.query(l,l); int hold3=st.query(l-1,l-1); if(hold3<hold2){ //ans.rangeUpd(l,l,-hold-1LL*s*abs(hold2-hold3)); counter-=ans[l]; ans[l]=-1LL*s*abs(hold2-hold3); counter+=ans[l]; } else{ //ans.rangeUpd(l,l,-hold+t*abs(hold2-hold3)); counter-=ans[l]; ans[l]=t*abs(hold2-hold3); counter+=ans[l]; } if(r!=n){ int hold4=st.query(r,r); int hold5=st.query(r+1,r+1); //int hold6=ans.query(r+1,r+1); if(hold4<hold5){ //ans.rangeUpd(r+1,r+1,-hold6-1LL*s*abs(hold4-hold5)); counter-=ans[r+1]; ans[r+1]=-1LL*s*abs(hold4-hold5); counter+=ans[r+1]; } else{ //ans.rangeUpd(r+1,r+1,-hold6+t*abs(hold4-hold5)); counter-=ans[r+1]; ans[r+1]=t*abs(hold4-hold5); counter+=ans[r+1]; } } //cout << ans.query(0,n) << "\n"; cout << counter << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...