제출 #1133741

#제출 시각아이디문제언어결과실행 시간메모리
1133741AvianshProgression (NOI20_progression)C++20
0 / 100
94 ms38984 KiB
#include <bits/stdc++.h> using namespace std; struct node{ int lval,rval,lcn,rcn,len,best; bool operator==(node a){ return (a.lval==lval&&a.rval==rval&&lcn==a.lcn&&a.rcn==rcn&&a.len==len&&a.best==best); } }; struct lazynode{ int add,fix; bool toadd,tofix; }; void print(node a){ cout << a.lval << " " << a.lcn << " " << a.rval << " " << a.rcn << " " << a.len << " " << a.best << "\n"; } struct segTree{ node *st; lazynode *laz; node defnode; lazynode lazdef; int n; node unite(node a, node b){ if(a==defnode){ return b; } if(b==defnode){ return a; } node ans = defnode; ans.lval=a.lval; ans.rval=b.rval; ans.best=max(a.best,b.best); ans.len=a.len+b.len; ans.lcn=a.lcn; ans.rcn=b.rcn; if(a.rval==b.lval){ if(a.lcn==a.len){ ans.lcn=a.len+b.lcn; } if(b.rcn==b.len){ ans.rcn=b.len+a.rcn; } ans.best=max(ans.best,a.rcn+b.lcn); } ans.best=max({ans.best,ans.lcn,ans.rcn}); return ans; } segTree(int siz){ int x = (int)ceil(log2(siz)); x++; st=new node[(1<<x)]; laz=new lazynode[(1<<x)]; n=siz-1; defnode.lval=0; defnode.rval=0; defnode.lcn=0; defnode.rcn=0; defnode.len=0; defnode.best=0; lazdef.toadd=0; lazdef.tofix=0; lazdef.add=0; lazdef.fix=0; fill(st,st+(1<<x),defnode); fill(laz,laz+(1<<x),lazdef); } void push(int ind, int l, int r){ if(laz[ind].tofix){ st[ind].lval=laz[ind].fix; st[ind].rval=laz[ind].fix; st[ind].lcn=(r-l+1); st[ind].rcn=(r-l+1); st[ind].len=(r-l+1); st[ind].best=(r-l+1); } if(laz[ind].toadd){ st[ind].lval+=laz[ind].add; st[ind].rval+=laz[ind].add; } if(l==r){ laz[ind].toadd=0; laz[ind].tofix=0; laz[ind].add=0; laz[ind].fix=0; return; } if(laz[ind].tofix){ laz[2*ind+1].toadd=0; laz[2*ind+1].tofix=1; laz[2*ind+1].add=0; laz[2*ind+1].fix=laz[ind].fix; laz[2*ind+2].toadd=0; laz[2*ind+2].tofix=1; laz[2*ind+2].add=0; laz[2*ind+2].fix=laz[ind].fix; } if(laz[ind].toadd){ laz[2*ind+1].toadd=1; laz[2*ind+1].add+=laz[ind].add; laz[2*ind+2].toadd=1; laz[2*ind+2].add+=laz[ind].add; } laz[ind].toadd=0; laz[ind].tofix=0; laz[ind].add=0; laz[ind].fix=0; } void updateFix(int s, int e, int val, int l, int r, int ind){ push(ind,l,r); if(s<=l&&r<=e){ laz[ind].tofix=1; laz[ind].toadd=0; laz[ind].add=0; laz[ind].fix=val; push(ind,l,r); return; } if(s>r||e<l){ return; } int mid = (l+r)/2; updateFix(s,e,val,l,mid,ind*2+1); updateFix(s,e,val,mid+1,r,ind*2+2); push(2*ind+1,l,mid); push(2*ind+2,mid+1,r); st[ind]=unite(st[ind*2+1],st[ind*2+2]); } void updateAdd(int s, int e, int val, int l,int r,int ind){ push(ind,l,r); if(s<=l&&r<=e){ laz[ind].toadd=1; laz[ind].add=val; push(ind,l,r); return; } if(s>r||e<l){ return; } int mid = (l+r)/2; updateAdd(s,e,val,l,mid,ind*2+1); updateAdd(s,e,val,mid+1,r,ind*2+2); push(2*ind+1,l,mid); push(2*ind+2,mid+1,r); st[ind]=unite(st[ind*2+1],st[ind*2+2]); } node query(int s, int e, int l,int r, int ind){ push(ind,l,r); if(s<=l&&r<=e){ return st[ind]; } if(s>r||e<l){ return defnode; } int mid = (l+r)/2; return unite(query(s,e,l,mid,ind*2+1),query(s,e,mid+1,r,ind*2+2)); } }; signed main(){ ios::sync_with_stdio(0); cin.tie(0); int n,q; cin >> n >> q; segTree st(n-1); int arr[n]; for(int i = 0;i<n;i++){ cin >> arr[i]; } int ans = 0; int curr= 0; int prev=-1e9; for(int i = 1;i<n;i++){ if(arr[i]-arr[i-1]==prev){ curr++; } else{ curr=1; prev=arr[i]-arr[i-1]; } ans=max(curr,ans); } ans++; while(q--){ int t; cin >> t; if(t==1){ int l,r,s,c; cin >> l >> r >> s >> c; } if(t==2){ int l,r,s,c; cin >> l >> r >> s >> c; ans=n; } if(t==3){ int l,r; cin >> l >> r; cout << 1 << "\n"; } } return 0; //sub2: while(q--){ int t; cin >> t; if(t==1){ int l,r,s,c; cin >> l >> r >> s >> c; l--;r--; for(int i = l;i<=r;i++){ arr[i]+=s+(i-l)*c; } } if(t==2){ int l,r,s,c; cin >> l >> r >> s >> c; l--;r--; for(int i = l;i<=r;i++){ arr[i]=s+(i-l)*c; } } if(t==3){ int l,r; cin >> l >> r; l--;r--; if(l==r){ cout << 1 << "\n"; continue; } int ans = 1; int curr = 0; int prev = -1e9; for(int i = l+1;i<=r;i++){ if(arr[i]-arr[i-1]==prev){ curr++; } else{ curr=1; prev=arr[i]-arr[i-1]; } ans=max(curr,ans); } cout << ans+1 << "\n"; } } return 0; for(int i = 1;i<n;i++){ st.updateFix(i-1,i-1,arr[i]-arr[i-1],0,n-2,0); } while(q--){ int t; cin >> t; if(t==1){ int l,r,s,c; cin >> l >> r >> s >> c; l--;r--; st.updateAdd(l,r-1,c,0,n-2,0); if(l){ st.updateAdd(l,l,s,0,n-2,0); } if(r<=n-2){ st.updateAdd(r,r,-s,0,n-2,0); } } if(t==2){ int l,r,s,c; cin >> l >> r >> s >> c; l--;r--; cout << "oh no\n"; } if(t==3){ int l,r; cin >> l >> r; l--;r--; if(l==r){ cout << 1 << "\n"; continue; } cout << st.query(l,r-1,0,n-2,0).best+1 << "\n"; } } return 0; }
#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...