请大佬指出本rj的错误,回复必关
查看原帖
请大佬指出本rj的错误,回复必关
959481
niusitu楼主2025/1/20 19:52

代码如下

#include<bits/stdc++.h>


#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((seg[p].l+seg[p].r)>>1)

#define INF -(2<<29)
#define int long long 
#define re register
using namespace std;
const int maxn=1e6+6;
int n,q,a[maxn];

inline long long read()
{
    long long x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
struct SugmentTree
{
	int l,r;
	int mx;
	int add;
	int cover;
}seg[maxn<<2];
void update(int p)
{
	seg[p].mx=max(seg[ls].mx,seg[rs].mx);
}
void build(int l,int r,int p)
{
	seg[p].l=l,seg[p].r=r;
	if (l==r) 
	{
		seg[p].mx=a[l];
		seg[p].cover=INF;
		seg[p].add=0;
		return ;
	}
	int m=(l+r)/2;
	build(l,m,ls),build(m+1,r,rs);
	update(p);
}
	
void spread_cover(int p)
{
	if (seg[p].cover!=INF)
	{
		seg[ls].add=0,seg[rs].add=0;
		seg[ls].mx=seg[p].cover;
		seg[rs].mx=seg[p].cover;
		seg[ls].cover=seg[p].cover;
		seg[rs].cover=seg[p].cover;
		seg[p].cover=INF;
	}	
}

void spread_add(int p)
{
	if (seg[p].add) 
	{
		spread_cover(p);
		seg[ls].add+=seg[p].add;
		seg[rs].add+=seg[p].add;
		seg[ls].mx+=seg[p].add;
		seg[rs].mx+=seg[p].add;
		seg[p].add=0;
	}
}

void modify_cover(int ql,int qr,int k,int p)
{
	if (ql<=seg[p].l&&qr>=seg[p].r)
	{
		seg[p].add=0;
		seg[p].mx=k;
		seg[p].cover=k;
		return ;
	}
	spread_cover(p),spread_add(p);
	if (ql<=mid) modify_cover(ql,qr,k,ls);
	if (qr>mid) modify_cover(ql,qr,k,rs);
	update(p);
}

void modify_add(int ql,int qr,int k,int p)
{
	if (ql<=seg[p].l&&qr>=seg[p].r)
	{
		spread_cover(p);
		seg[p].add+=k;
		seg[p].mx+=k;
		return ;
	}
	spread_cover(p),spread_add(p);
	if (ql<=mid) modify_add(ql,qr,k,ls);
	if (qr>mid) modify_add(ql,qr,k,rs);
	update(p);
}

int query(int ql,int qr,int p)
{
	if (ql<=seg[p].l&&qr>=seg[p].r)
	{
		return seg[p].mx;
	}
	spread_cover(p),spread_add(p);
	int ans=INF;
	if (ql<=mid) ans=max(ans,query(ql,qr,ls));
	if (qr>mid) ans=max(ans,query(ql,qr,rs));
	return ans;
}

signed main()
{
	n=read(),q=read();
	for (re int i=1;i<=n;++i)
	{
		a[i]=read();
	}
	build(1,n,1);
	
	while(q--)
	{
		int op,l,r,k;
		op=read(),l=read(),r=read();
		if (op==1)
		{
			k=read();
			modify_cover(l,r,k,1);
		}
		else if (op==2)
		{
			k=read();
			modify_add(l,r,k,1);
		}
		else
		{
			printf("%lld\n",query(l,r,1));
		}	
	}	
		
	/*
	modify_add(3,4,2,1);
	cout<<query(1,4,1);	
	*/
	return 0;
}

本rj觉得可能是区间加数的函数出问题了 很急在线等

2025/1/20 19:52
加载中...