线段树超时?打了标记!
查看原帖
线段树超时?打了标记!
534953
Furina_zbg楼主2023/10/20 09:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100100;
int n, m, i, a[N], ans;
struct no {
	int sum;
};
struct lazy {
	int add;
};
struct node {
	lazy t;
	no val;
	int len;
}seg[N * 4];
no operator + (const no &l, const no &r) {
	return {l.sum + r.sum};
}
lazy operator + (const lazy &v, const lazy &t) {
	return {v.add+ t.add};
}
void update(int id) {
	seg[id].val.sum = seg[id * 2].val.sum + seg[id * 2 + 1].val.sum;
	seg[id].len = seg[id * 2].len * 2;
}
void build(int id, int l, int r) {
	if(l == r) {
		seg[id].val.sum = a[l];
		seg[id].len = 1;
		return;
	}
	int mid = (l + r) / 2;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	update(id);
}
void setlazy(int id, lazy t) {
	seg[id].val.sum = seg[id].val.sum + t.add * seg[id].len;
	seg[id].t = seg[id].t + t;
}
void pushdown(int id) {
	if(seg[id].t.add != 0) {
		setlazy(id * 2, seg[id].t);
		setlazy(id * 2 + 1, seg[id].t);
		seg[id].t.add = 0;
	}
}
int query(int id, int l, int r, int ql, int qr) {
	if(l == qr && r == qr) return seg[id].val.sum;
	int mid = (l + r) / 2;
	pushdown(id);
	if(qr <= mid) return query(id * 2, l, mid, ql, qr);
	else if(ql > mid) return query(id * 2 + 1, mid + 1, r, ql, qr);
	else return query(id * 2, l, mid, ql, mid) + query(id * 2 + 1, mid + 1, r, mid + 1, qr);	
}
void modify(int id, int l, int r, int ql, int qr, lazy t) {
	if(l == qr && r == qr) {setlazy(id, t); return;}
	int mid = (l + r) / 2;
	pushdown(id);
	if(qr <= mid) return modify(id * 2, l, mid, ql, qr, t);
	else if(ql > mid) return modify(id * 2 + 1, mid + 1, r, ql, qr, t);
	else {
		modify(id * 2, l, mid, ql, mid, t);
		modify(id * 2 + 1, mid + 1, r, mid + 1, qr, t);
	}
	update(id);
}
signed main () {
	scanf("%lld %lld", &n, &m);
	for (i = 1; i <= n; ++i) scanf("%lld", &a[i]);
	build(1, 1, n);
	while(m--) {
		int ty;
		scanf("%lld", &ty);
		if(ty == 1) {
			int l, r, d;
			scanf("%lld %lld %lld", &l, &r, &d);
			modify(1, 1, n, l, r, (lazy){d});
		} else {
			int l, r;
			scanf("%lld %lld",&l, &r);
			ans = query(1, 1, n, l, r);
			printf("%lld\n", ans);
		}
	}
}

我很难理解,题解没加标记没有超,我加了反而还超了,大佬帮忙看看问题在哪里。谢谢!

2023/10/20 09:48
加载中...