普通线段树能调吧
  • 板块灌水区
  • 楼主feEr
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/1/14 19:01
  • 上次更新2025/1/15 00:04:37
查看原帖
普通线段树能调吧
1383338
feEr楼主2025/1/14 19:01

区间赋值+区间最大值

永久化标记

struct tree
{
	struct node
	{
		int l,r; // 左右边界
		node *lson,*rson; // 左右儿子
		int maxs; // 区间最大值
		int set_tag; // 区间赋值标记
		node();
		node(int l,int r):l(l),r(r),lson(nullptr),rson(nullptr),maxs(0),set_tag(0){}
	} *root;
	#define init \
		int &l=Node->l,&r=Node->r; \
		node *&lson=Node->lson,*&rson=Node->rson; \
		int &maxs=Node->maxs; \
		int &set_tag=Node->set_tag;
	void upd(node *Node) // 更新左右儿子
	{
		init;
		int mid=l+r>>1;
		if(lson==nullptr)
			lson=new node(l,mid);
		if(rson==nullptr)
			rson=new node(mid+1,r);
	}
	void modify(node *Node,int x,int y,int v) // 区间赋值
	{
		init;
		if(y<l||r<x)
			return;
		maxs=v;
		if(x<=l&&r<=y)
		{
			set_tag=v;
			return;
		}
		upd(Node);
		modify(lson,x,y,v);
		modify(rson,x,y,v);
	}
	int query(node *Node,int x,int y) // 区间查询
	{
		init;
		if(y<l||r<x)
			return 0;
		int ans=set_tag;
		if(x<=l&&r<=y)
			return ans=max(ans,maxs);
		upd(Node);
		ans=max(ans,query(lson,x,y));
		ans=max(ans,query(rson,x,y));
		return ans;
	}
	tree(){}
	tree(int l,int r):root(new node(l,r)){}
	#undef init
};
2025/1/14 19:01
加载中...