#1AC,其它全WA!c艹求助
查看原帖
#1AC,其它全WA!c艹求助
743373
Vitamin_B楼主2023/7/28 21:04

link

代码

# include <bits/stdc++.h>

# define old_six \
	ios::sync_with_stdio (0);\
	\
	cin.tie (0);\
	\
	cout.tie (0);

# define ffor(i,name) \
	for (auto i = name.begin (); i != name.end (); ++ i)

# define iter(type) \
	type :: iterator

# define reg register

using namespace std;

typedef size_t st;

typedef long long ll;

typedef pair <int, int> pii;

typedef pair <ll, ll> pll;

ll n, m, a[100005], sum[400005], lazy[400005], op, x, y, k;

void build_tree (ll x, ll l, ll r) {

	if (l == r) {

		sum[x] = a[l];

		return ;

	}

	ll mid = l + r >> 1;

	build_tree (x << 1, l, mid), build_tree ((x << 1) + 1, mid + 1, r);

	sum[x] = sum[x << 1] + sum[(x << 1) + 1];

	return ;

}

void tamper (ll now, ll l, ll r, ll x, ll y) {

	if (l == x && r == y) {

		sum[now] += k * (r - l + 1);

		lazy[now] += k;

		return ;

	}

	ll mid = l + r >> 1;

	if (mid >= y)
		tamper (now << 1, l, mid, x, y);
	else if (mid < x)
		tamper ((now << 1) + 1, mid + 1, r, x, y);
	else
		tamper (now << 1, l, mid, x, mid), tamper ((now << 1) + 1, mid + 1, r, mid + 1, y);

	sum[now] = sum[now << 1] + sum[(now << 1) + 1];

	return ;

}

ll find (ll now, ll l, ll r, ll x, ll y) {

	if (l == x && r == y)
		return sum[now];

	ll mid = l + r >> 1;

	lazy[now << 1] += lazy[now];

	lazy[(now << 1) + 1] += lazy[now];

	sum[now << 1] += lazy[now] * (mid - l + 1);

	sum[(now << 1) + 1] += lazy[now] * (r - mid);

	lazy[now] = 0;

	if (mid >= y)
		return find (now << 1, l, mid, x, y);

	if (mid < x)
		return find ((now << 1) + 1, mid + 1, r, x, y);

	return find (now << 1, l, mid, x, mid) + find ((now << 1) + 1, mid + 1, r, mid + 1, y);

}

int main () {

	old_six

	cin >> n >> m;

	for (reg int i = 1; i <= n; ++ i)
		cin >> a[i];

	build_tree (1, 1, n);

	while (m --) {

		cin >> op >> x >> y;

		if (op < 2)
			cin >> k, tamper (1, 1, n, x, y);
		else
			cout << find (1, 1, n, x, y) << '\n';

	}

	return 0;

}
2023/7/28 21:04
加载中...