样例AC,提交10pts!??
查看原帖
样例AC,提交10pts!??
264463
添哥楼主2022/2/16 18:05
#include<iostream>
using namespace std;
long long tree[800005][3],lazy_tag[800005],a[200005];
void push_down(long long s,long long i)//标记下传 
{
	if(s>1)
	{
		lazy_tag[i*2]+=lazy_tag[i];
		lazy_tag[i*2+1]+=lazy_tag[i];
	}
	tree[i][1]+=lazy_tag[i]*s;
	tree[i][2]+=lazy_tag[i]*s;
	lazy_tag[i]=0;
}
void build(long long l,long long r,long long i)//建树
{
    if(l==r)
    {
        tree[i][1]=a[l];
        tree[i][2]=a[l];
        return;
    }
    long long mid=(l+r)/2;
    build(l,mid,i*2);
    build(mid+1,r,i*2+1);
    tree[i][1]=tree[i*2][1]+tree[i*2+1][1];
    tree[i][2]=min(tree[i*2][2],tree[i*2+1][2]);
}
long long find(long long l,long long r,long long ll,long long rr,long long i)//区间和
{
	push_down(r-l+1,i);
    if(rr<l||r<ll)
    {
        return 0;
    }
    if(ll<=l&&r<=rr)
    {
        return tree[i][1];
    }
    long long mid=(l+r)/2;
    return find(l,mid,ll,rr,i*2)+find(mid+1,r,ll,rr,i*2+1);
}
long long ask(long long l,long long r,long long ll,long long rr,long long i)//区间最值
{
	push_down(r-l+1,i);
    if(rr<l||r<ll)
    {
        return 2147483647;
    }
    if(ll<=l&&r<=rr)
    {
        return tree[i][2];
    }
    long long mid=(l+r)/2;
    return min(ask(l,mid,ll,rr,i*2),ask(mid+1,r,ll,rr,i*2+1));
}
void add(long long l,long long r,long long ll,long long rr,long long i,long long s)//区间修改 
{
	push_down(r-l+1,i);
    if(rr<l||r<ll)
    {
        return;
    }
    else if(ll<=l&&r<=rr)
    {
        lazy_tag[i]+=s;
        push_down(r-l+1,i); 
    }
    else if(l!=r)
    {
		tree[i][1]+=s*(min(rr,r)-max(ll,l)+1);
		tree[i][2]+=s*(min(rr,r)-max(ll,l)+1);
	    long long mid=(l+r)/2;
    	add(l,mid,ll,rr,i*2,s);
		add(mid+1,r,ll,rr,i*2+1,s);
	}
	else
	{
		tree[i][1]+=s;
		tree[i][2]+=s;
	}
}
int main()
{
    long long n,m;
    cin>>n>>m;
    for(long long i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    build(1,n,1);
    while(m--)
	{
		long long l,r,k;
		char ch;
		cin>>ch;
		if(ch=='P')
		{
			cin>>l>>r>>k;
			add(1,n,l,r,1,k);
		}
		else if(ch=='M')
		{
			cin>>l>>r;
			cout<<ask(1,n,l,r,1)<<endl;
		}
		else
		{
			cin>>l>>r;
			cout<<find(1,n,l,r,1)<<endl;
		}
	} 
    return 0;
}
2022/2/16 18:05
加载中...