线段树最小值
  • 板块学术版
  • 楼主wflhx2011
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/2/24 16:22
  • 上次更新2024/2/24 19:24:11
查看原帖
线段树最小值
759976
wflhx2011楼主2024/2/24 16:22

WA了

#include<bits/stdc++.h>
using namespace std;
long long sum[800005],add[800005];
inline void pushup(int rt)
{
	sum[rt]=min(sum[rt<<1],sum[rt<<1|1]);
}
void build(int l,int r,int root)
{
	if(l==r)
	{
		scanf("%lld",&sum[root]);
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,root<<1);
	build(mid+1,r,root<<1|1);
	pushup(root);
}
inline void pushdown(int root,int len)
{
	if(add[root])
	{
		add[root<<1]+=add[root];
		add[root<<1|1]+=add[root];
		sum[root<<1]+=add[root]*(len-(len>>1));
		sum[root<<1|1]+=add[root]*(len>>1);
		add[root]=0;
	}
}
void update(int L,int R,int c,int l,int r,int root)
{
	if(L<=l&&r<=R)
	{
		add[root]+=c;
		sum[root]+=c*(r-l+1);
		return ;
	}
	pushdown(root,r-l+1);
	int mid=(l+r)>>1;
	if(L<=mid)
		update(L,R,c,l,mid,root<<1);
	if(mid+1<=R)
		update(L,R,c,mid+1,r,root<<1|1);
	pushup(root);
}
long long query(int L,int R,int l,int r,int root)
{
	if(L<=l&&r<=R)
		return sum[root];
	pushdown(root,r-l+1);
	int mid=(l+r)>>1;
	long long res=1e18;
	if(L<=mid)
		res=min(res,query(L,R,l,mid,root<<1));
	if(mid+1<=R)
		res=min(res,query(L,R,mid+1,r,root<<1|1));
	return res;
}
int main()
{
	int n,m;
	cin>>n;
	build(1,n,1);
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int l,r;
		cin>>l>>r;
		l++,r++;
		long long c;
		char ch;
		ch=getchar();
		if(ch=='\n')
			if(l<=r)
				printf("%lld\n",query(l,r,1,n,1));
			else 
				printf("%lld\n",min(query(l,n,1,n,1),query(1,r,1,n,1)));
		else
		{
			cin>>c; 
			if(l<=r)
				update(l,r,c,1,n,1);
			else 
				update(l,n,c,1,n,1),update(1,r,c,1,n,1);
		}
	}
	return 0;
}
2024/2/24 16:22
加载中...