Submission #839270

#TimeUsernameProblemLanguageResultExecution timeMemory
8392708pete8Progression (NOI20_progression)C++17
68 / 100
786 ms78956 KiB
#include<iostream> #include<stack> #include<map> #include<vector> #include<string> #include<unordered_map> #include <queue> #include<cstring> #include<algorithm> #include<limits.h> #include<cmath> #include<bitset> using namespace std; #define ll long long #define f first #define endl "\n" #define s second #define pii pair<int,int> #define ppii pair<pii,int> #define pb push_back #define fastio ios::sync_with_stdio(false);cin.tie(NULL); #define int long long #define mod 1000000007 const int mxn=4*1e5,lg=20,inf=1e18; int n,m; struct node{ int as=0,ms=1,ls=0,rs=0,lv=0,rv=0,sum=0; //all size, max size, left size,right size,left val,right val; }; void print(node a){ cout<<a.as<<" "<<a.ms<<" "<<a.ls<<" "<<a.rs<<" "<<a.lv<<" "<<a.rv<<'\n'; } node seg[4*mxn+10]; int add[4*mxn+10],change[4*mxn+10],v[mxn+10]; bool yes[4*mxn+10]; int h;//height of tree node comb(node a,node b){ node tmp; if(a.rv==inf)return b; if(b.rv==inf)return a; tmp.ms=max(a.ms,b.ms); if(a.rv==b.lv)tmp.ms=max(tmp.ms,a.rs+b.ls); tmp.lv=a.lv; tmp.rv=b.rv; if(a.ls==a.as&&b.lv==a.lv)tmp.ls=a.ls+b.ls; if(b.rs==b.as&&a.rv==b.rv)tmp.rs=b.rs+a.rs; tmp.ls=max(tmp.ls,a.ls); tmp.rs=max(tmp.rs,b.rs); tmp.as=a.as+b.as; tmp.sum=a.sum+b.sum; return tmp; } void build(int pos,int l,int r){ // cout<<pos<<" "<<l<<" "<<r<<'\n'; if(r<l)return; if(l==r){ seg[pos].as=seg[pos].ls=seg[pos].rs=seg[pos].ms=1; seg[pos].lv=seg[pos].rv=seg[pos].sum=v[l]; } else{ int mid=l+(r-l)/2; build(pos*2,l,mid); build(pos*2+1,mid+1,r); seg[pos]=comb(seg[pos<<1],seg[(pos<<1)|1]); } } void app(int pos){ if(yes[pos]){ seg[pos].ms=seg[pos].ls=seg[pos].rs=seg[pos].as; seg[pos].lv=seg[pos].rv=change[pos]; seg[pos].sum=seg[pos].as*change[pos]; } if(add[pos]){ seg[pos].lv+=add[pos]; seg[pos].rv+=add[pos]; seg[pos].sum+=(seg[pos].as*add[pos]); } } void push(int pos,int l,int r){ if(add[pos]){ app(pos); if(l!=r){ add[pos*2]+=add[pos]; add[pos*2+1]+=add[pos]; } } if(yes[pos]){ app(pos); if(l!=r){ add[pos*2]=0; add[pos*2+1]=0; yes[pos*2]=true; yes[pos*2+1]=true; change[pos*2]=change[pos]; change[pos*2+1]=change[pos]; } } add[pos]=0; yes[pos]=false; change[pos]=0; } void update(int pos,int l,int r,int ql,int qr,int val){ if(r<l)return; push(pos,l,r); //cout<<pos<<' '<<l<<" "<<r<<' '<<ql<<" "<<qr<<'\n'; if(r<ql||l>qr)return; if(ql<=l&&r<=qr){ add[pos]+=val; push(pos,l,r); return; } int mid=l+(r-l)/2; update(pos*2,l,mid,ql,qr,val); update(pos*2+1,mid+1,r,ql,qr,val); seg[pos]=comb(seg[pos*2],seg[pos*2+1]); } void update2(int pos,int l,int r,int ql,int qr,int val){ if(r<l)return; if(r<ql||l>qr)return; //cout<<pos<<" "<<l<<" "<<r<<" "<<ql<<" "<<qr<<" "<<val<<'\n'; if(ql<=l&&r<=qr){ change[pos]=val; yes[pos]=true; add[pos]=0; push(pos,l,r); return; } push(pos,l,r); int mid=l+(r-l)/2; update2(pos*2,l,mid,ql,qr,val); update2(pos*2+1,mid+1,r,ql,qr,val); seg[pos]=comb(seg[pos<<1],seg[(pos<<1)|1]); } node query(int pos,int l,int r,int ql,int qr){ node tmp; tmp.rv=inf; if(r<l)return tmp; if(r<ql||l>qr)return tmp; push(pos,l,r); if(ql<=l&&r<=qr)return seg[pos]; int mid=l+(r-l)/2; if(ql<=mid&&mid<qr)return comb(query(pos*2,l,mid,ql,qr),query(pos*2+1,mid+1,r,ql,qr)); if(ql<=mid)return query(pos*2,l,mid,ql,qr); return query(pos*2+1,mid+1,r,ql,qr); } int32_t main(){ fastio int n,m;cin>>n>>m; for(int i=0;i<n;i++)cin>>v[i]; int val=v[0]; for(int i=0;i<n;i++)v[i]=v[i+1]-v[i]; build(1,0,n-1); int diff; while(m--){ int type;cin>>type; if(type==1){ int l,r,x,c;cin>>l>>r>>x>>c; l--,r--; if(l)update(1,0,n-1,l-1,l-1,x); else val+=x; update(1,0,n-1,r,r,-((x+((r-l)*c)))); if(l!=r)update(1,0,n-1,l,r-1,c); } else if(type==2){ int l,r,x,c;cin>>l>>r>>x>>c; l--,r--; int suml,sumr; sumr=query(1,0,n-1,0,r).sum+val; diff=sumr-(x+(r-l)*c); update2(1,0,n-1,r,r,diff); if(l){ if(l>1)suml=query(1,0,n-1,0,l-2).sum+val; else suml=val; diff=x-suml; update2(1,0,n-1,l-1,l-1,diff); } else val=x; if(l!=r)update2(1,0,n-1,l,r-1,c); } else{ int l,r;cin>>l>>r; l--; r--; cout<<((l==r)?0:query(1,0,n-1,l,r-1).ms)+1<<'\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...