P1253 扶苏的问题
>>>加 减 乘 覆盖 都有优先级 优先级高的影响优先级低的
要泾渭分明 互不干扰
>>>query change area_ ->pushdown
>>>更改查询范围 都在 k 结点的范围 就直接 lazzy tag 标记 节省时间
若不 则 pushdown
>>>每一个结点的lazy tag 都是有 优先级 有序 下降的
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long //#define int long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=1e6+10; const ll inf=1e18+10; ll n,q,a[maxn]; struct node{ ll l,r; ll add,maxx,cv; }s[maxn<<2]; void build(int k,int l,int r) { s[k].l=l,s[k].r=r,s[k].cv=-inf,s[k].maxx=-inf; if(l==r) { s[k].maxx=a[l]; return; } int mid=l+r>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); s[k].maxx=max(s[k<<1].maxx,s[k<<1|1].maxx); } void pushdown(int k) { if(s[k].cv!=-inf) { s[k<<1].maxx=s[k<<1|1].maxx=s[k].cv; s[k<<1].cv=s[k<<1|1].cv=s[k].cv; s[k<<1].add=s[k<<1|1].add=0; s[k].cv=-inf; } if(s[k].add) { s[k<<1].maxx+=s[k].add; s[k<<1|1].maxx+=s[k].add; //s[k<<1].cv+=s[k].add; s[k<<1|1].cv+=s[k].add; s[k<<1].add+=s[k].add; s[k<<1|1].add+=s[k].add; s[k].add=0; } } void change(int k,int x,int y,int val) { if(s[k].l>y||s[k].r<x) return; if(s[k].l>=x&&s[k].r<=y) { s[k].cv=val;//cv-> È«²¿¸Ä³É s[k].maxx=val; s[k].add=0; return; } pushdown(k); int mid=s[k].l+s[k].r>>1; if(mid>=x) change(k<<1,x,y,val); if(mid<=y) change(k<<1|1,x,y,val); s[k].maxx=max(s[k<<1].maxx,s[k<<1|1].maxx); } void areaAdd(int k,int x,int y,int val) { if(s[k].l>y||s[k].r<x) return; if(s[k].l>=x&&s[k].r<=y) { // s[k].cv+=val; s[k].maxx+=val; s[k].add+=val; return; } pushdown(k); int mid=s[k].l+s[k].r>>1; if(mid>=x) areaAdd(k<<1,x,y,val); if(mid<=y) areaAdd(k<<1|1,x,y,val); s[k].maxx=max(s[k<<1].maxx,s[k<<1|1].maxx); } ll query(int k,int x,int y) { if(s[k].l>y||s[k].r<x) return -inf; if(s[k].l>=x&&s[k].r<=y) return s[k].maxx; pushdown(k); int mid=s[k].l+s[k].r>>1; ll res=-inf; if(mid>=x) res=max(res,query(k<<1,x,y)) ; if(mid<=y) res=max(res,query(k<<1|1,x,y)) ; return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>q; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n); for(int i=1;i<=q;i++) { int op; cin>>op; if(op==1){ int l,r,x; cin>>l>>r>>x; change(1,l,r,x); } else if(op==2){ int l,r,x; cin>>l>>r>>x; areaAdd(1,l,r,x); } else{ int l,r; cin>>l>>r; cout<<query(1,l,r)<<'\n'; } } return 0; }

浙公网安备 33010602011771号