60分求助,再调不过男朋友要跟人跑了
查看原帖
60分求助,再调不过男朋友要跟人跑了
524906
刘辰雨楼主2023/4/12 12:11
#include <iostream>
#include <cstdio>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f;

struct node {
	node *lson, *rson;
	int lside, rside;
	long long maxv, lazychange, lazyadd;
	node() {
		this->lson = this->rson = NULL;
		this->lside = this->rside = 0;
		this->maxv = this->lazychange = this->lazyadd = -INF;
	}
}; 

void build(node *now, int l, int r) {
	now->lside = l;
	now->rside = r;
	if(l != r) {
		now->lson = new node;
		now->rson = new node;
		build(now->lson, l, (l+r)>>1);
		build(now->rson, ((l+r)>>1)+1, r);
	}
}

void update_add(node *now) {
	if(now->lazyadd != -INF) {
		if(now->lson) {
			now->lson->maxv += now->lazyadd;
			now->lson->lazyadd = now->lson->lazyadd == -INF ? now->lazyadd : now->lson->lazyadd + now->lazyadd;
		}
		if(now->rson) {
			now->rson->maxv += now->lazyadd;
			now->rson->lazyadd = now->rson->lazyadd == -INF ? now->lazyadd : now->rson->lazyadd + now->lazyadd;
		}
	}
	now->lazyadd = -INF;
}

void update_change(node *now) {
	if(now->lazychange != -INF) {
		if(now->lson) {
			now->lson->maxv = now->lazychange;
			now->lson->lazychange = now->lazychange;
		}
		if(now->rson) {
			now->rson->maxv = now->lazychange;
			now->rson->lazychange = now->lazychange;
		}
	}
	now->lazychange = -INF;
}

void change(node *now, int l, int r, long long v) {
	if(now->lside > r || now->rside < l) {
		return ;
	}
	if(now->lside >= l && now->rside <= r) {
		update_add(now);
		now->maxv = v;
		now->lazychange = v;
	} else {
		update_change(now);
		update_add(now);
		change(now->lson, l, r, v);
		change(now->rson, l, r, v);
		now->maxv = max(now->lson->maxv, now->rson->maxv);
	}
//	cout << now->lside << " " << now->rside << " " << now->maxv << " " << now->lazychange << " " << now->lazyadd << endl;
}

void add(node *now, int l, int r, long long v) {
	if(now->lside > r || now->rside < l) {
		return ;
	}
	if(now->lside >= l && now->rside <= r) {
		now->maxv += v;
		if(now->lazychange != -INF) {
			now->lazychange += v;
		} else {
			now->lazyadd = now->lazyadd == -INF ? v : now->lazyadd+v;
		}
	} else {
		update_change(now);
		update_add(now);
		add(now->lson, l, r, v);
		add(now->rson, l, r, v);
		now->maxv = max(now->lson->maxv, now->rson->maxv);
	}
}

long long query(node *now, int l, int r) {
	if(now->lside > r || now->rside < l) {
		return -INF;
	}
	if(now->lside >= l && now->rside <= r) {
//		cout << now->lside << " " << now->rside << " " << now->maxv << " " << now->lazyadd << " " << now->lazychange << " now." << endl;
		return now->maxv;
	} else {
		update_change(now);
		update_add(now);
		return max(query(now->lson, l, r), query(now->rson, l, r));
	}
}

int n, q, opt, x, y;
long long k;
node *root;

int main() {
	scanf("%d%d", &n, &q);
	root = new node;
	build(root, 1, n);
	for(int i = 1 ; i<= n ; i++) {
		scanf("%lld", &k);
		change(root, i, i, k);
	}
	while(q--) {
		scanf("%d", &opt);
		if(opt == 1) {
			scanf("%d%d%lld", &x, &y, &k);
			change(root, x, y, k);
		} else if(opt == 2) {
			scanf("%d%d%lld", &x, &y, &k);
			add(root, x, y, k);
		} else {
			scanf("%d%d", &x, &y);
			printf("%lld\n", query(root, x, y));
		}
	}
	return 0;
}

Wa on #7->#10

2023/4/12 12:11
加载中...