扶苏的问题,求调50pts
  • 板块灌水区
  • 楼主Wangbingxiang
  • 当前回复2
  • 已保存回复4
  • 发布时间2024/9/20 21:21
  • 上次更新2024/9/20 22:08:38
查看原帖
扶苏的问题,求调50pts
889828
Wangbingxiang楼主2024/9/20 21:21
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int a[maxn + 2];
struct tree {
	int l, r, tag;
	long long pre, add, co;
} t[4 * maxn + 2];
void bulid(int p, int l, int r) {
	t[p].l = l;
	t[p].r = r;
	if (l == r) {
		t[p].pre = a[l];
		return;
	}
	int mid = (l+r) >> 1;
	bulid(p * 2, l, mid);
	bulid(p * 2 + 1, mid + 1, r);
	t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
void cover(int p) {
	if (t[p].tag) {
		t[p * 2].pre = t[p * 2 + 1].pre = t[p].co;
		t[p * 2].co = t[p * 2 + 1].co = t[p].co;
		t[p * 2].tag = t[p * 2 + 1].tag = 1;
		t[p].co = 0;
		t[p].tag = 0;
	}
}
void spread(int p) {
	if (t[p].add) {
		t[p * 2].pre += t[p].add;
		t[p * 2 + 1].pre += t[p].add;
		t[p * 2].add += t[p].add;
		t[p * 2 + 1].add += t[p].add;
		
		t[p].add = 0;
	}
}
void change1(int p, int x, int y, int z) {
	if (x <= t[p].l && y >= t[p].r) {
		t[p].pre += (long long)z;
		t[p].add += z;
		return;
	}
	spread(p);
	int mid = (t[p].l+t[p].r) >> 1;
	if (x <= mid) change1(p * 2, x, y, z);
	if (y > mid) change1(p * 2 + 1, x, y, z);
	t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
void change2(int p, int x, int y, int z) {
	if (x <= t[p].l && y >= t[p].r) {
		t[p].pre = (long long)z;
		t[p].co = z;
		t[p].tag = 1;
		return;
	}
	cover(p);
	int mid = (t[p].l+t[p].r) >> 1;
	if (x <= mid) change2(p * 2, x, y, z);
	if (y > mid) change2(p * 2 + 1, x, y, z);
	t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
long long ask(int p, int x, int y) {
	if (x <= t[p].l && y >= t[p].r) return t[p].pre;
	spread(p);
	cover(p);
	int mid = (t[p].l+t[p].r) >> 1;
	long long ans = 0;
	if (x <= mid) ans = max(ask(p * 2, x, y),ans);
	if (y > mid) ans = max(ask(p * 2 + 1, x, y),ans);
	return ans;
}

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	bulid(1, 1, n);
	for (int i = 1; i <= m; i++) {
		int q, x, y, z;
		scanf("%d", &q);
		if (q == 2) {
			scanf("%d%d%d", &x, &y, &z);
			change1(1, x, y, z);
		} else if (q == 1) {
			scanf("%d%d%d", &x, &y, &z);
			change2(1, x, y, z);
		} else if (q == 3) {
		    scanf("%d%d", &x, &y);
		    cout << ask(1, x, y) << endl;
		}
	}
	return 0;
}
2024/9/20 21:21
加载中...