• BZOJ4364 wall砖墙


    BZOJ4364 wall砖墙

    题目传送门

    题解

    一道比较好想的线段树。线段树每个节点维护当前区间的最低高度(Mn)与最高高度(Mx)。然后每次询问的时候记得用父节点的值更新子节点的(Mn)(Mx)就行了,最后每个叶子节点的(Mx)就是答案了。

    code

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    bool Finish_read;
    template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
    template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
    template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('
    ');}
    template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
    /*================Header Template==============*/
    const int maxn=2e6+500;
    #define ls(o) o<<1
    #define rs(o) o<<1|1
    int n,k;
    /*==================Define Area================*/
    struct SegmentTree {
    	struct node {
    		int l,r;
    		int mx,mn;
    	}t[maxn<<2];
    	void Update(int o) {
    		t[o].mn=min(t[ls(o)].mn,t[rs(o)].mn);
    		t[o].mx=max(t[ls(o)].mx,t[rs(o)].mx);
    	}
    	void Pushdown(int o) {
    		if(t[o].mn>t[ls(o)].mx) t[ls(o)].mx=t[ls(o)].mn=t[o].mn;
    	    else if(t[o].mn>t[ls(o)].mn) t[ls(o)].mn=t[o].mn;
    	    if(t[o].mn>t[rs(o)].mx) t[rs(o)].mx=t[rs(o)].mn=t[o].mn;
    	    else if(t[o].mn>t[rs(o)].mn) t[rs(o)].mn=t[o].mn;
    	    
    	    if(t[o].mx<t[ls(o)].mn) t[ls(o)].mx=t[ls(o)].mn=t[o].mx;
    	    else if(t[o].mx<t[ls(o)].mx) t[ls(o)].mx=t[o].mx;
    	    if(t[o].mx<t[rs(o)].mn) t[rs(o)].mx=t[rs(o)].mn=t[o].mx;
    	    else if(t[o].mx<t[rs(o)].mx) t[rs(o)].mx=t[o].mx;
    	}
    	void Build(int o,int l,int r) {
    		t[o].l=l;t[o].r=r;
    		t[o].mn=t[o].mx=0;
    		if(l==r) return ;
    		int mid=(l+r)>>1;
    		Build(ls(o),l,mid);
    		Build(rs(o),mid+1,r);
    		Update(o);
    	}
    	void Modify1(int o,int l,int r,int v) {
    		if(t[o].l>=l&&t[o].r<=r) {
    			t[o].mx=max(t[o].mx,v);
    			t[o].mn=max(t[o].mn,v);
    			return ;
    		}
    		Pushdown(o);
    		int mid=(t[o].l+t[o].r)>>1;
    		if(mid>=l) Modify1(ls(o),l,r,v);
    		if(mid<r) Modify1(rs(o),l,r,v);
    		Update(o);
    	}
    	void Modify2(int o,int l,int r,int v) {
    		if(t[o].l>=l&&t[o].r<=r) {
    			t[o].mx=min(t[o].mx,v);
    			t[o].mn=min(t[o].mn,v);
    			return ;
    		}
    		Pushdown(o);
    		int mid=(t[o].l+t[o].r)>>1;
    		if(mid>=l) Modify2(ls(o),l,r,v);
    		if(mid<r) Modify2(rs(o),l,r,v);
    		Update(o);
    	}
    	void Answer(int o) {
    		if(t[o].l==t[o].r) {
    			printf("%d
    ",t[o].mx);
    			return;
    		}
    		Pushdown(o);
    		Answer(ls(o));
    		Answer(rs(o));
    		return ;
    	}
    }T;
    
    int main() {
    	read(n);read(k);
    	T.Build(1,1,n);
    	for(int i=1,opt,l,r,v;i<=k;i++) {
    		read(opt);read(l);read(r);read(v);
    		l++;r++;
    		if(opt==1) T.Modify1(1,l,r,v);
    		else T.Modify2(1,l,r,v);
    		// puts("");
    	}
    	T.Answer(1);
    	return 0;
    }
    
    「我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。」
  • 相关阅读:
    python之路_爬虫之selenium模块
    python之路_爬虫之requests模块补充
    扩展中国剩余定理讲解
    扩展中国剩余定理讲解
    bzoj3225 [Sdoi2008]立方体覆盖——扫描线
    差分约束讲解
    CF917C Pollywog —— 状压DP + 矩乘优化
    斜率优化讲解
    AC自动机讲解
    BZOJ2870—最长道路tree
  • 原文地址:https://www.cnblogs.com/Apocrypha/p/9432058.html
Copyright © 2020-2023  润新知