BZOJ4364 wall砖墙

mac2022-06-30  133

目录

BZOJ4364 wall砖墙题解code

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+'0');} template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');} 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\n",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; }

转载于:https://www.cnblogs.com/Apocrypha/p/9432058.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)