线段树板子求条
查看原帖
线段树板子求条
959481
niusitu楼主2025/1/3 15:49

代码如下

#include<bits/stdc++.h>

using namespace std;
const int maxn=400000;
int n,m,a[maxn];
#define int long long
struct SegmentTree
{
	int l,r;
	int add;//lazy tag of add
	int dat_sum;//sum
	int dat_min;//min
}seg[maxn<<2];
void update(int p)
{
	seg[p].dat_sum=seg[p<<1].dat_sum+seg[p<<1|1].dat_sum;
	seg[p].dat_min=min(seg[p<<1].dat_min,seg[p<<1|1].dat_min);
}
void build(int l,int r,int p)
{
	seg[p].l=l,seg[p].r=r;
	if (l==r)
	{
		seg[p].dat_sum=seg[p].dat_min=a[l];
		return ;
	}
	int mid = (l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	update(p);
}
int len(int p)
{
	return seg[p].r-seg[p].l+1;
}
void spread(int p)
{
	if (!seg[p].add) return ;
	seg[p<<1].add+=seg[p].add;
	seg[p<<1|1].add+=seg[p].add;
	seg[p<<1].dat_min+=seg[p].add;
	seg[p<<1|1].dat_min+=seg[p].add;
	seg[p<<1].dat_sum=len(p<<1)*seg[p].add;
	seg[p<<1|1].dat_sum=len(p<<1|1)*seg[p].add;
	seg[p].add=0;
}
void change(int ql,int qr,int k,int p)
{
	if (ql<=seg[p].l&&qr>=seg[p].r)
	{
		seg[p].add+=k;
		seg[p].dat_min+=k;
		seg[p].dat_sum+=k*len(p);
		return ;
	}
	spread(p);
	int mid=(seg[p].l+seg[p].r)>>1;
	if (ql<=mid) change(ql,qr,k,p<<1);
	if (qr>mid) change(ql,qr,k,p<<1|1);
	update(p);
}
int ask_sum(int ql,int qr,int p)
{
	if (ql<=seg[p].l&&qr>=seg[p].r)
	{
		return seg[p].dat_sum;
	}
	spread(p);
	int mid = (seg[p].l+seg[p].r) >> 1;
	int ans=0;
	if (ql<=mid) ans+=ask_sum(ql,qr,p<<1);
	if (qr>mid) ans+=ask_sum(ql,qr,p<<1|1);
	return ans;
}
int ask_min(int ql,int qr,int p)
{
	if (ql<=seg[p].l&&qr>=seg[p].r)
	{
		return seg[p].dat_min;
	}
	spread(p);
	int mid = (seg[p].l+seg[p].r) >> 1;
	int ans=0x7f7f7f7f;
	if (ql<=mid) ans=ask_min(ql,qr,p<<1);
	if (qr>mid) ans=min(ans,ask_min(ql,qr,p<<1|1));
	return ans;
}

signed main()
{
	scanf("%lld %lld",&n,&m);
	for (int i=1;i<=n;++i)
	{
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	char op;
	for (int i=1;i<=m;i++)
	{
		cin>>op;
		if (op=='M')
		{
			int l,r;
			scanf("%lld",&l,&r);
			printf("%lld\n",ask_min(l,r,1));
		}
		if (op=='S')
		{
			int l,r;
			scanf("%lld %lld",&l,&r);
			printf("%lld\n",ask_sum(l,r,1));
		}
		if (op=='P')
		{
			int l,r,z;
			scanf("%lld %lld %lld",&l,&r,&z);
			change(l,r,z,1);
		}		
	}
	return 0;
}

关注能调出的大佬

2025/1/3 15:49
加载中...