求助,线下测评无错,线上测评全TLE
查看原帖
求助,线下测评无错,线上测评全TLE
490800
蒟蒻Mlady楼主2022/2/4 11:19
#include <bits/stdc++.h>
#define LL long long

using namespace std;

LL tr[270000], lazy[270000], a[100005], n, k, ll, rr;

void build(LL l, LL r, LL now)
{
	if(l == r) {
		tr[now] = a[l];
		return ;
	}
	LL m(l + ((r - l) >> 1));
	build(l, m, now << 1), build(m + 1, r, (now << 1) | 1);
	tr[now] = tr[now << 1] + tr[(now << 1) | 1];
}

void add(LL l, LL r, LL now)
{
	if(ll <= l && r <= rr) {
		tr[now] += (r - l + 1) * k, lazy[now] += k;
		return ;
	}
	LL m(l + ((r - l) >> 1));
	if(lazy[now])
		tr[now << 1] += lazy[now] * (m - l + 1), tr[now << 1 | 1] += lazy[now] * (r - m),
		lazy[now << 1] += lazy[now], lazy[now << 1 | 1] += lazy[now];
	lazy[now] = 0;
	if(ll <= m)
		add(l, m, now << 1);
	if(m < rr)
		add(m + 1, r, (now << 1) | 1);
	tr[now] = tr[now << 1] + tr[(now << 1) | 1];
}

LL check(LL l, LL r, LL now)
{
	if(ll <= l && r <= rr) return tr[now];
	LL m(l + ((r - l) >> 1));
	if(lazy[now])
		tr[now << 1] += lazy[now] * (m - l + 1), tr[now << 1 | 1] += lazy[now] * (r - m),
		lazy[now << 1] += lazy[now], lazy[now << 1 | 1] += lazy[now];
	lazy[now] = 0;
	LL sum(0);
	if(ll <= m)
		sum = check(l, m, now << 1);
	if(m < rr)
		sum += check(m + 1, r, (now << 1) | 1);
	return sum;
}

int main()
{
	LL t, f;
	scanf("%d %d", &n, &t);
	for(LL i(1); i <= n; ++ i) scanf("%d", &a[i]);
	build(1, n, 1);
	while(t --) {
		scanf("%d %d %d", &f, &ll, &rr);
		if(f == 2)
			printf("%d\n", check(1, n, 1));
		else
			scanf("%d", &k), add(1, n, 1);
	}
	return (0);
}
2022/2/4 11:19
加载中...