6-10wa(哭
查看原帖
6-10wa(哭
572048
陈asuna楼主2024/2/27 00:58

一般来说,6-10是因为负值的原因,但是我觉得我的负值开的够小来着。本人刚学几星期的菜鸡,有无大佬帮帮忙来着,感谢

#include<bits/stdc++.h>
using namespace std;
#define lc p*2
#define rc p*2+1
#define ll long long
const ll INF =0x3f3f3f3f3f3f3f3f;

const int N=1e7+20;
struct node
{
	ll l,r,maxn,add1,add2,flag;
}tr[4*N];
ll w[N];

void pushup(ll p)
{
	//cout<<"lc "<<lc<<" "<<tr[lc].maxn<<" rc "<<rc<<" "<<tr[rc].maxn<<endl;
	tr[p].maxn=max(tr[lc].maxn,tr[rc].maxn);
	//cout<<"p "<<p<<endl;
}

void build(ll p,ll l,ll r)
{
	tr[p]={l,r,w[l],0};
	tr[p].flag=0;
	if(l==r) return;
	ll m=l+r>>1;
	build(lc,l,m);
	build(rc,m+1,r);
	pushup(p);
}



void pushdown2(ll p)
{
	if(tr[p].flag)
	{
		tr[lc].flag=tr[p].flag;
		tr[rc].flag=tr[p].flag;
		tr[lc].maxn=tr[p].add2;
		tr[rc].maxn=tr[p].add2;
		tr[p].flag=0;
		tr[p].add1=tr[lc].add1=tr[rc].add1=0;
	}
}

void pushdown1(ll p)
{
	pushdown2(p);
	if(tr[p].add1)
	{
		tr[lc].add1+=tr[p].add1;
		tr[rc].add1+=tr[p].add1;
		tr[lc].maxn+=tr[p].add1;
		tr[rc].maxn+=tr[p].add1;
		tr[p].add1=0;
	}
}

void update1(ll p,ll x,ll y,ll k)
{
	
	//cout<<"p1 "<<p<<" "<<tr[p].maxn<<" "<<x<<y<<tr[p].l<<tr[p].r<<endl;
	if(x<=tr[p].l&&tr[p].r<=y)
	{
		//cout<<p<<endl;
		tr[p].maxn+=k;
		tr[p].add1+=k;
		return;
	}
	ll m=tr[p].l+tr[p].r>>1;
	pushdown2(p);
	pushdown1(p);
	
	if(x<=m) update1(lc,x,y,k);
	if(m<y) update1(rc,x,y,k);
	pushup(p);
}

void update2(ll p,ll x,ll y,ll k)
{
	if(x<=tr[p].l&&tr[p].r<=y)
	{
		tr[p].maxn=k;
		//cout<<p<<" "<<tr[p].maxn<<endl;
		tr[p].flag=1;
		tr[p].add2=k;
		return;
	}
	ll m=tr[p].l+tr[p].r>>1;
	
	pushdown2(p);
	pushdown1(p);
	if(x<=m) update2(lc,x,y,k);
	if(m<y) update2(rc,x,y,k);
	pushup(p);
}

ll query(ll p,ll x,ll y)
{
	if(x<=tr[p].l&&tr[p].r<=y)
	{
		//cout<<p<<" "<<tr[p].maxn<<endl;
		return tr[p].maxn;
	}
	int m=tr[p].l+tr[p].r>>1;
	ll maxn=-INF;
	pushdown2(p);
	pushdown1(p);
	if(x<=m) maxn=max(maxn,query(lc,x,y));
	if(y>m) maxn=max(maxn,query(rc,x,y));
	pushup(p);
	return maxn;
}

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&w[i]);
	}
	build(1,1,n);
	while(m--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			ll l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			update2(1,l,r,x);
		}
		else if(op==2)
		{
			ll l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			update1(1,l,r,x);
		}
		else if(op==3)
		{
			ll l,r;
			scanf("%lld%lld",&l,&r);
			printf("%d\n",query(1,l,r));
		}
	}
	return 0;
}

2024/2/27 00:58
加载中...