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;
}
View Code

 

 
posted @ 2023-08-13 16:23  JMXZ  阅读(7)  评论(0)    收藏  举报