代码求调玄红名小号+蓝名小号两关
  • 板块学术版
  • 楼主SleepinGod
  • 当前回复15
  • 已保存回复16
  • 发布时间2025/7/26 09:54
  • 上次更新2025/7/26 15:24:10
查看原帖
代码求调玄红名小号+蓝名小号两关
661573
SleepinGod楼主2025/7/26 09:54

题目链接

WA了

#include <bits/stdc++.h>

using namespace std;

const long long N = 2e5 + 5;

struct S {
	long long x, tag1, tag2, size;
} tr[N * 4];

struct A {
	long long x, minn, tag, size;
} s[N * 4];

long long n, m, a[N];

void pushd(long long x) {
	if (tr[x].tag1 == 0) {
		return;
	}
	if (tr[2 * x].tag1 == 0) {
		tr[2 * x].tag1 = 1;
	}
	if (tr[2 * x + 1].tag1 == 0) {
		tr[2 * x + 1].tag1 = 1;
	}
	tr[2 * x].tag1 *= tr[x].tag1;
	tr[2 * x + 1].tag1 *= tr[x].tag1;
	tr[2 * x].tag2 = tr[x].tag2 + (tr[x].tag1 * tr[2 * x].tag2);
	tr[2 * x + 1].tag2 = tr[x].tag2 + (tr[x].tag1 * tr[2 * x + 1].tag2);
	tr[2 * x].x = tr[x].tag2 * tr[2 * x].size + (tr[2 * x].x * tr[x].tag1);
	tr[2 * x + 1].x = tr[x].tag2 * tr[2 * x + 1].size + (tr[2 * x + 1].x * tr[x].tag1);
	tr[x].tag1 = 0, tr[x].tag2 = 0;
}

void pushu(long long x) {
	tr[x].x = tr[2 * x].x + tr[2 * x + 1].x;
	tr[x].size = tr[2 * x].size + tr[2 * x + 1].size;
}

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

void pushdown(long long x) { 
    if (s[x].tag == 0) {
    	return;
	}
	s[2 * x].tag += s[x].tag, s[2 * x + 1].tag += s[x].tag;
	s[2 * x].x += s[2 * x].size * s[x].tag;
	s[2 * x + 1].x += s[2 * x + 1].size * s[x].tag;
	s[2 * x].minn += s[x].tag, s[2 * x + 1].minn += s[x].tag;
	s[x].tag = 0;
}

void build(long long x, long long l, long long r) {
	if (l == r) {
		s[x] = {a[l], a[l], 0, 1};
		tr[x] = {0, 0, 0, 0}; 
		return;
	}
	long long mid = (l + r) / 2;
	build(2 * x, l, mid), build(2 * x + 1, mid + 1, r);
	pushup(x), pushu(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 s[x].x;
	}
	long long mid = (l + r) / 2, ans = 0;
	pushdown(x);
	if (sx <= mid) {
		ans += E(2 * x, l, mid, sx, min(ex, mid));
	}
	if (mid + 1 <= ex) {
		ans += E(2 * x + 1, mid + 1, r, max(sx, mid + 1), ex);
	}
	return ans;
}

void D(long long x, long long l, long long r, long long sx, long long ex, long long o) {
	if (s[x].size == 0) {
		return;
	}
	if (l == sx && r == ex) {
		if (s[x].minn >= o) {
			s[x].minn -= o, s[x].tag -= o, s[x].x -= o * s[x].size;
			return;
		}
	}
	if (l == r) {
		tr[x] = {s[x].x, 0, 0, 1};
		s[x] = {0, (long long)1e9, 0, 0};
		return;
	}
	long long mid = (l + r) / 2;
	pushdown(x), pushd(x);
	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(sx, mid + 1), ex, o);
	}
	pushup(x), pushu(x);
}

void DS(long long x, long long l, long long r, long long sx, long long ex, long long o) {
	if (!tr[x].size) {
		return;
	}
	if (l == sx && r == ex) {
		if (tr[x].tag1 == 0) {
			tr[x].tag1 = -1;
		} else {
			tr[x].tag1 = -tr[x].tag1;
		}
		tr[x].tag2 = o - tr[x].tag2;
		tr[x].x = o * tr[x].size - tr[x].x;
		return;
	}
	pushd(x);
	long long mid = (l + r) / 2;
	if (sx <= mid) {
		DS(2 * x, l, mid, sx, min(ex, mid), o);
	}
	if (mid + 1 <= ex) {
		DS(2 * x + 1, mid + 1, r, max(sx, mid + 1), ex, o);
	}
	pushu(x);
}

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

void chage(long long l, long long r, long long x) {
	D(1, 1, n, l, r, x);
	DS(1, 1, n, l, r, x);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	long long T;
	for (cin >> T; T--;) {
		cin >> n >> m;
		for (long long i = 1; i <= n; i++) {
			cin >> a[i];
		}
		build(1, 1, n);
		for (long long op, l, r, x; m--;) {
			cin >> op >> l >> r;
			if (op == 1) {
				cin >> x;
				chage(l, r, x);
			} else {
				cout << E(1, 1, n, l, r) + Sum(1, 1, n, l, r) << "\n";
			}
		}
	}
	return 0;
}
2025/7/26 09:54
加载中...