蒟蒻求助 30 pts
查看原帖
蒟蒻求助 30 pts
715233
Dino_chx楼主2023/6/22 12:24

只AC #1 # 3 #4

求助

#include<bits/stdc++.h>
#define ll long long
#define inf LONG_LONG_MAX
using namespace std;
const int N=2e5+114514;
struct ST
{
	int l,r;
	ll minn,sum,tag;
}tree[N<<2];
int a[N];
void pushup(int x)
{
	tree[x].minn=min(tree[x<<1].minn,tree[x<<1|1].minn);
	tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
	return;
}
void build(int x,int l,int r)
{
	tree[x]={l,r,inf,0,0};
	if(l==r)
	{
		tree[x]={l,r,a[l],a[l],0};
		return;
	}
	int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
	return;
}
void pushdown(int x)
{
	ST &rt=tree[x],&ls=tree[x<<1],&rs=tree[x<<1|1];
	if(rt.tag)
	{
		ls.tag+=rt.tag;
		rs.tag+=rt.tag;
		ls.minn+=rt.tag;
		rs.minn+=rt.tag;
		ls.sum+=(ls.r-ls.l+1)*rt.tag;
		rs.sum+=(rs.r-rs.l+1)*rt.tag;
		rt.tag=0;
	}
	return;
}
void update(int x,int l,int r,int k)
{
	if(l<=tree[x].l&&r>=tree[x].r)
	{
		tree[x].minn+=k;
		tree[x].tag+=k;
		tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
		return;
	}
	pushdown(x);
	int mid=tree[x].l+tree[x].r>>1;
	if(l<=mid)
		update(x<<1,l,r,k);
	if(r>mid)
		update(x<<1|1,l,r,k);
	pushup(x);
	return;
}
ll query1(int x,int l,int r)
{
	if(l<=tree[x].l&&r>=tree[x].r)
		return tree[x].minn;
	pushdown(x);
	int mid=tree[x].l+tree[x].r>>1;
	ll ans=inf;
	if(l<=mid)
		ans=min(ans,query1(x<<1,l,r));
	if(r>mid)
		ans=min(ans,query1(x<<1|1,l,r));
	return ans;
}
ll query2(int x,int l,int r)
{
	if(l<=tree[x].l&&r>=tree[x].r)
		return tree[x].sum;
	pushdown(x);
	int mid=tree[x].l+tree[x].r>>1;
	ll ans=0;
	if(l<=mid)
		ans+=query2(x<<1,l,r);
	if(r>mid)
		ans+=query2(x<<1|1,l,r);
	return ans;
}
void print(int p)
{
	printf("The list is : \n");
	for(int i=1;i<=p;i++)
	{
		printf("%lld ",query2(1,i,i));
	}
	putchar('\n');
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	} 
	build(1,1,n);
	while(q--)
	{
		char op;
		int l,r,k;
		cin>>op>>l>>r;
		if(op=='M')  //min
			cout<<query1(1,l,r)<<"\n";
		if(op=='P') //add
		{
			cin>>k;
			update(1,l,r,k);
		}
		if(op=='S') //sum
			cout<<query2(1,l,r)<<"\n";
//		print(n);
	}
    return 0;
}
2023/6/22 12:24
加载中...