代码求调!AC 3,4,6
查看原帖
代码求调!AC 3,4,6
715213
yi_fan0305楼主2023/5/20 20:59

rt, 最后两个点T,其他点WA

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l + r) >> 1)

const int N = 5e5 + 5;
const int inf = 1e9;

int n, m;
ll las;

struct nodeA {
	int len;
	ll sum, maxx, minn, laz1, laz2;
	ll val;
} A[N << 2];

void pushup(int u) {
	A[u].sum = A[ls].sum + A[rs].sum;
	A[u].maxx = max(A[ls].maxx, A[rs].maxx);
	A[u].val = max(A[u].val, A[u].maxx);
	A[u].minn = min(A[ls].minn, A[rs].minn);
//	A[u].val = max(A[u].val, max(A[ls].val, A[rs].val));
}

void pushdown(int u) {
	if (A[u].laz2 != inf) {
		ll g = A[u].laz2;
//		if (A[ls].laz1) {
//			A[ls].val = max(A[ls].val, A[ls].maxx + A[ls].laz1);
//		}
//		if (A[rs].laz1) {
//			A[rs].val = max(A[rs].val, A[rs].maxx + A[rs].laz1);
//		}
		A[ls].laz1 = A[rs].laz1 = 0;
		A[ls].sum = A[ls].len * g;
		A[rs].sum = A[rs].len * g;
		A[ls].laz2 = g, A[rs].laz2 = g;
		A[ls].minn = A[ls].maxx = g;
		A[rs].minn = A[rs].maxx = g;
		A[u].laz2 = inf;
		A[ls].val = max(A[ls].val, A[ls].maxx);
		A[rs].val = max(A[rs].val, A[rs].maxx);
		A[u].val = max(A[u].val, max(A[ls].val, A[rs].val));
	}
	if (A[u].laz1) {
		ll g = A[u].laz1;
		A[ls].sum += A[ls].len * g;
		A[rs].sum += A[rs].len * g;
		A[ls].laz1 += g, A[rs].laz1 += g;
		A[ls].maxx += g, A[rs].maxx += g;
		A[ls].minn += g, A[rs].minn += g;
		A[u].laz1 = 0;
		A[ls].val = max(A[ls].val, A[ls].maxx);
		A[rs].val = max(A[rs].val, A[rs].maxx);
		A[u].val = max(A[u].val, max(A[ls].val, A[rs].val));
	}
}

void build(int u, int l, int r) {
	A[u].len = r - l + 1;
	A[u].laz1 = 0;
	A[u].laz2 = inf;
	if (l == r) {
		cin >> A[u].sum;
		A[u].val = A[u].maxx = A[u].minn = A[u].sum;
		return ;
	}
	build(ls, l, mid);
	build(rs, mid + 1, r);
	pushup(u);
}

void add(int u, int l, int r, int lr, int rr, ll c) {
	if (lr <= l && r <= rr) {
		A[u].sum += A[u].len * c;
		A[u].maxx += c;
		A[u].minn += c;
		A[u].laz1 += c;
		A[u].val = max(A[u].val, A[u].maxx);
		return ;
	}
	pushdown(u);
	if (lr <= mid) {
		add(ls, l, mid, lr, rr, c);
	}
	if (rr > mid) {
		add(rs, mid + 1, r, lr, rr, c);
	}
	pushup(u);
}

void modify(int u, int l, int r, int lr, int rr, ll c) {
	if (l > r)	return ;
	if (A[u].maxx <= c)	return ;
	if (lr <= l && r <= rr && A[u].minn >= c) { // 这个区间的最小值大于c
		A[u].laz2 = c;
//		A[u].val = max(A[u].val, A[u].maxx + A[u].laz1);
		A[u].laz1 = 0;
		A[u].sum = A[u].len * c;
		A[u].minn = A[u].maxx = c;
		return ;
	}
	pushdown(u);
	if (lr <= mid) {
		modify(ls, l, mid, lr, rr, c);
	}
	if (rr > mid) {
		modify(rs, mid + 1, r, lr, rr, c);
	}
	pushup(u);
}

ll query_sum(int u, int l, int r, int lr, int rr) {
	if (lr <= l && r <= rr) {
		return A[u].sum;
	}
	ll ans = 0;
	pushdown(u);
	if (lr <= mid)	ans += query_sum(ls, l, mid, lr, rr);
	if (rr > mid)	ans += query_sum(rs, mid + 1, r, lr, rr);
	pushup(u);
	return ans;
}

ll query_max(int u, int l, int r, int lr, int rr) {
	if (lr <= l && r <= rr) {
		return A[u].maxx;
	}
	pushdown(u);
	ll ans = -inf;
	if (lr <= mid)	ans = max(ans, query_max(ls, l, mid, lr, rr));
	if (rr > mid)	ans = max(ans, query_max(rs, mid + 1, r, lr, rr));
	pushup(u);
	return ans;
}

ll query_max_old(int u, int l, int r, int lr, int rr) {
	if (lr <= l && r <= rr) {
		return A[u].val;
	}
	pushdown(u);
	ll ans = -inf;
	if (lr <= mid)	ans = max(ans, query_max_old(ls, l, mid, lr, rr));
	if (rr > mid)	ans = max(ans, query_max_old(rs, mid + 1, r, lr, rr));
	pushup(u);
	return ans;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	build(1, 1, n);
	for (int i = 1, op, l, r; i <= m; ++ i) {
		ll k;
		cin >> op >> l >> r;
		if (op == 1 || op == 2) {
			cin >> k;
			if (op == 1) {
				add(1, 1, n, l, r, k);
			}
			else {
				modify(1, 1, n, l, r, k);
			}
		}
		else {
			if (op == 3) {
				cout << query_sum(1, 1, n, l, r) << '\n';
			}
			if (op == 4) {
				cout << query_max(1, 1, n, l, r) << '\n';
			}
			if (op == 5) {
				cout << query_max_old(1, 1, n, l, r) << '\n';
			}
		}
	}
	return 0;
}
2023/5/20 20:59
加载中...