mxqz线段树
查看原帖
mxqz线段树
399116
LYqwq楼主2022/7/27 16:15
#include <iostream>
#include <cstring>
using namespace std;
template<typename T=int>
inline T read(){
    T X=0; bool flag=1; char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
    if(flag) return X;
    return ~(X-1);
}

template<typename T=int>
inline void write(T X){
    if(X<0) putchar('-'),X=~(X-1);
    T s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    putchar('\n');
}

const int N=2e6+5,inf=0x3f3f3f3f;
int n,k,op,l,r,h;

class SgT{
    public:
        void build(int rt,int l,int r){
            t[rt].l=l,t[rt].r=r,t[rt].min=inf,t[rt].max=0;
            if(l==r){
                t[rt].min=t[rt].max=0;
                return;
            }
            int mid=l+r>>1;
            build(ls(rt),l,mid);
            build(rs(rt),mid+1,r);
        }
        void update(int rt,int l,int r,int h,int op){
            if(l<=t[rt].l && t[rt].r<=r){
                if(op==1) lmax(rt,h);
                else lmin(rt,h);
                return;
            }
            pushdown(rt);
            int mid=t[rt].l+t[rt].r>>1;
            if(l<=mid) update(ls(rt),l,r,h,op);
            if(r>mid) update(rs(rt),l,r,h,op);
        }
        void query(int rt){
            if(t[rt].l==t[rt].r){
                write(t[rt].max);
                return;
            }
            pushdown(rt);
            query(ls(rt));
            query(rs(rt));
        }
    private:
        struct node{
            int l,r;
            int min,max;
        }t[N<<2];
        inline int ls(int rt){return rt<<1;}
        inline int rs(int rt){return rt<<1|1;}
        inline void lmin(int rt,int h){
            t[rt].min=min(t[rt].min,h);
            t[rt].max=min(t[rt].max,h);
        }
        inline void lmax(int rt,int h){
            t[rt].min=max(t[rt].min,h);
            t[rt].max=max(t[rt].max,h);
        }
        inline void pushdown(int rt){
            if(t[rt].l==t[rt].r) return;
            lmin(t[rt].l,t[rt].min),lmin(t[rt].r,t[rt].min);
            lmax(t[rt].l,t[rt].max),lmax(t[rt].r,t[rt].max);
            t[rt].min=inf,t[rt].max=0;
        }
}t;

int main(){
    n=read(),k=read(); 
    t.build(1,1,n);
    while(k--){
        op=read(),l=read()+1,r=read()+1,h=read();
        t.update(1,l,r,h,op);
    }
    t.query(1);
    return 0;
}

QwQ谢谢了,交上去是酱紫的

2022/7/27 16:15
加载中...