帮忙看看为什么样例过不去
查看原帖
帮忙看看为什么样例过不去
384064
kevin985楼主2021/11/16 23:20
#include <bits/stdc++.h>
#define N 100013
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
int a[N];
int t[N << 2],tag[N << 2];
void build(int u,int l,int r)
{
	if(l == r)
	{
		t[u] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1,l,mid);
	build(u << 1 | 1,mid + 1,r);
	t[u] = t[u << 1] + t[u << 1 | 1];
}
void f(int u,int l,int r,int k)
{
	tag[u] += k;
	t[u] += (r - l + 1) * k;
}
void push_down(int u,int l,int r)
{
	int mid = (l + r) >> 1;
	f(u << 1,l,mid,tag[u]);
	f(u << 1 | 1,mid + 1,r,tag[u]);
	tag[u] = 0;
}
void update(int u,int l,int r,int L,int R,int k)
{
//	printf("u: u = %d l = %d r = %d L = %d R = %d\n",u,l,r,L,R);
//	if(R < l || L > r) return;
	if(L <= l && r <= R)
	{
		tag[u] += k;
		t[u] += (r - l + 1) * k;
//		push_down(u,l,r,k);
		return;
	}
	push_down(u,l,r);
	int mid = (l + r) >> 1;
	if(L <= mid) update(u << 1,l,mid,l,R,k);
	if(R > mid) update(u << 1 | 1,mid + 1,r,L,R,k);
	t[u] = t[u << 1] + t[u << 1 | 1];
}
ll query(int u,int l,int r,int L,int R)
{
//	printf("q: u = %d l = %d r = %d L = %d R = %d\n",u,l,r,L,R);
	if(L <= l && r <= R)
	{
		printf("\n");
		return t[u];
	}
	push_down(u,l,r);
	int mid = (l + r) >> 1;
	ll sum = 0;
	if(L <= mid) sum += query(u << 1,l,mid,L,R);
	if(R > mid) sum += query(u << 1 | 1,mid + 1,r,L,R);
	printf("sum = %d\n",sum);
	return sum;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;++i)
	{
		int op,L,R,k;
		scanf("%d%d%d",&op,&L,&R);
		if(op == 1)
		{
			scanf("%d",&k);
			update(1,1,n,L,R,k);
		}else printf("%lld\n",query(1,1,n,L,R));
	}
	return 0;
}
2021/11/16 23:20
加载中...