代码求调玄红名小号+蓝名小号两关
  • 板块学术版
  • 楼主SleepinGod
  • 当前回复11
  • 已保存回复11
  • 发布时间2025/7/23 08:43
  • 上次更新2025/7/23 13:44:15
查看原帖
代码求调玄红名小号+蓝名小号两关
661573
SleepinGod楼主2025/7/23 08:43

题目链接


#include <bits/stdc++.h>

using namespace std;

const long long N = 1e5 + 5;

long long n, q, a[N];
 
struct S {
	long long sum, minn, tag;
} tr[N * 4];

void pushup(long long x) {
	tr[x].sum = tr[2 * x].sum + tr[2 * x + 1].sum;
	tr[x].minn = min(tr[2 * x].minn, tr[2 * x + 1].minn);
}

void build (long long x, long long l, long long r) {
	if (l == r) {
		tr[x] = {0, a[l], 0};
		return;
	}
	long long mid = (l + r) / 2;
	build(2 * x, l, mid), build(2 * x + 1, mid + 1, r);
	pushup(x);
}

void pushdown(long long x) {
	tr[2 * x].tag += tr[x].tag;
	tr[2 * x + 1].tag += tr[x].tag;
	tr[2 * x].minn += tr[x].tag;
	tr[2 * x + 1].minn += tr[x].tag;
	tr[x].tag = 0;
}

void D(long long x, long long l, long long r, long long sx, long long ex, bool o) {
	if (l == sx && r == ex) {
		if (o) {
			tr[x].minn--, tr[x].tag--;
		} 
		if (tr[x].minn > 0) {
			return;
		}
		if (l == r) {
			tr[x].sum++, tr[x].minn = a[l];
			return;
		}
		o = 0; 
	}
	pushdown(x);
	long long mid = (l + r) / 2;
	if (sx <= mid) {
		D(2 * x, l, mid, sx, min(mid, ex), o);
	}
	if (mid + 1 <= ex) {
		D(2 * x + 1, mid + 1, r, max(mid + 1, sx), ex, o);
	}
	pushup(x);
}

long long E(long long x, long long l, long long r, long long sx, long long ex) {
	if (l == sx && r == ex) {
		return tr[x].sum;
	}
	pushdown(x); 
	long long mid = (l + r) / 2, ans = 0;
	if (sx <= mid) {
		ans += E(2 * x, l, mid, sx, min(mid, ex));
	}
	if (mid + 1 <= ex) {
		ans += E(2 * x + 1, mid + 1, r, max(mid + 1, sx), ex);
	}
	return ans;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> q;
	for (long long i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build(1, 1, n);
	long long l, r;
	for (string op; q--;) {
		cin >> op >> l >> r;
	    if (op[0] == 'a') {
	    	D(1, 1, n, l, r, 1);
		} else {
		    cout << E(1, 1, n, l, r) << "\n";
		}
	}
	return 0;
}///
2025/7/23 08:43
加载中...