线段树
查看原帖
线段树
141331
chenbinggang楼主2021/6/18 22:01
#include<iostream>
#include<cstdio>
using namespace std;
#define lson l,mid,k<<1
#define rson mid+1,r,k<<1|1
int c[100000],add[100000],sum[100000];
int n,m;
void Push(int k)
{
	c[k]=c[k<<1]+c[k<<1|1];
	return;
}
void build(int l,int r,int k)
{
	if(l==r)
	{
		scanf("%d",&c[k]);
		return;
	}
	int mid=l+r>>1;
	build(lson);
	build(rson);
	Push(k);
}
void modify(int L,int R,int C,int l,int r,int k)
{
	c[k]+=C*(min(R,r)-max(L,l));
	if(L<=l&&R>=r)
	{
		add[k]+=C;
		return;
	}
//	cout<<c[k]<<" "<<k<<endl;
	int mid=l+r>>1;
	if(L<=mid) modify(L,R,C,lson);
	 if(R>mid)modify(L,R,C,rson);
//	else  modify(L,R,C,lson),modify(L,R,C,rson);
}
int query(int L,int R,int l,int r,int k)
{
	if(L<=l&&R>=r)return c[k]+add[k]*(r-l+1);
	int mid=(l+r)>>1;
	int res=add[k]*(min(R,r)-max(L,l));
	if(L<=mid) res+=query(L,R,lson);
	if(R>mid) res+=query(L,R,rson);
	return res;
}
int main()
{
	scanf("%d%d",&n,&m);
	build(1,n,1);
	int t,x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&t);
		if(t==1)
		{
			//cout<<100;
			scanf("%d%d%d",&x,&y,&z);
			modify(x,y,z,1,n,1);
		}
		if(t==2)
		{
			scanf("%d%d",&x,&y);
		//	res=0;
			cout<<query(x,y,1,n,1)<<endl;
		}
	}
}

为什么答案不对,感觉代码一点毛病也没有

2021/6/18 22:01
加载中...