50pts球调,应该不是负无穷问题
查看原帖
50pts球调,应该不是负无穷问题
640816
cengzh楼主2024/10/15 18:59

rt

# include <stdio.h>
# include <limits.h>
# include <iostream>

using namespace std;

long long Tree[1000005*4];
long long tag1[1000005*4];
long long tag2[1000005*4];
long long arr[1000005];
int n,m;

void add_tag1(int node,int l,int r,int k)
{
    tag1[node] += k;
    Tree[node] += k;
    return ;
}

void add_tag2(int node,int l,int r,int k)
{
 	tag1[node] = 0;
    tag2[node] = k;
    Tree[node] = k;
    return ;
}

void push_down(int node,int l,int r)
{
	if (tag2[node] != LLONG_MAX)
	{
        int mid = (l + r) / 2;
        add_tag2(node*2,l,mid,tag2[node]);
        add_tag2(node*2+1,mid+1,r,tag2[node]);
        tag2[node] = LLONG_MAX;		
	}
    if (tag1[node] != 0)
    {
        int mid = (l + r) / 2;
        add_tag1(node*2,l,mid,tag1[node]);
        add_tag1(node*2+1,mid+1,r,tag1[node]);
        tag1[node] = 0;
	}
    return ;
}

void Build(int node,int l,int r)
{
	tag2[node] = LLONG_MAX;
    if (l == r)
    {
        Tree[node] = arr[l];
        return ;
    }

    int mid = (l+r) /2;
    Build(node*2,l,mid);
    Build(node*2+1,mid+1,r);

	Tree[node] = max(Tree[node*2],Tree[node*2+1]);

    return  ;
}

void Update1(int node,int l,int r,int tl,int tr,int w)
{
    if (tl <= l && tr >= r)
    {
        add_tag1(node,l,r,w);
        return ;
    }

    push_down(node,l,r);
    int mid = (l+r) / 2;

    if (mid  >= tl)
    {
        Update1(node*2,l,mid,tl,tr,w);
    }
    if (mid < tr)
    {
        Update1(node*2+1,mid+1,r,tl,tr,w);
    }
    
	Tree[node] = max(Tree[node*2],Tree[node*2+1]);
	
    return ;
}

void Update2(int node,int l,int r,int tl,int tr,int w)
{
    if (tl <= l && tr >= r)
    {
        add_tag2(node,l,r,w);
        return ;
    }

    push_down(node,l,r);
    int mid = (l+r) / 2;

    if (mid >= tl)
    {
        Update2(node*2,l,mid,tl,tr,w);
    }
    if (mid < tr)
    {
        Update2(node*2+1,mid+1,r,tl,tr,w);
    }

	Tree[node] = max(Tree[node*2],Tree[node*2+1]);
	
    return ;
}

long long Query(int node,int l,int r,int tl,int tr)
{
    if (tl <= l && tr >= r)
    {
        return Tree[node];
    }

    int mid = (l+r)/2;

    push_down(node,l,r);
    long long res=LLONG_MIN;

    if (mid  >= tl)
    {
        res = max(Query(node*2,l,mid,tl,tr),res);
    }
    if (mid < tr)
    {
        res = max(Query(node*2+1,mid+1,r,tl,tr),res);
    }

    return res;
}

int main (void)
{
	
    scanf ("%d %d",&n,&m);

    for (int i=1;i<=n;i++)
    {
        scanf ("%lld",&arr[i]);
    }

    Build(1,1,n);

    for (int i=0;i<m;i++)
    {
        int opt,x,y;
        scanf ("%d %d %d",&opt,&x,&y);
        if (opt == 1)
        {
            int k;
            scanf ("%d",&k);
            Update2(1,1,n,x,y,k);
        }
        else if (opt == 2)
        {
            int k;
            scanf ("%d",&k);
            Update1(1,1,n,x,y,k);        	
		}
		else
        {
			printf ("%lld\n",Query(1,1,n,x,y));
        }    
    }

    return 0;
}

C语言且码风良好(?

2024/10/15 18:59
加载中...