求教实现5个操作的线段树哪里写错了
  • 板块学术版
  • 楼主rmxlinux
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/2/10 16:04
  • 上次更新2023/10/28 09:01:41
查看原帖
求教实现5个操作的线段树哪里写错了
86896
rmxlinux楼主2022/2/10 16:04

RT,5个操作分别是区间增加、区间推平、区间求最大值、区间求最小值、区间求和

和朴素算法对拍发现有细微错误

#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 300005
#define lson (x<<1)
#define rson (x<<1|1)
struct node {
	int l, r, sum, add, chn, maxq, minq ;
} seg[MAXN];
int a[MAXN], n, m ;
void build(int x, int l, int r) {
	seg[x].l = l ;
	seg[x].r = r ;
	if(l == r) {
		seg[x].sum = seg[x].maxq = seg[x].minq = a[l] ;
		seg[x].add = seg[x].chn = 0 ;
		return ;
	}
	int mid = (l + r) >> 1 ;
	build(lson, l, mid) ;
	build(rson, mid + 1, r) ;
	seg[x].sum = seg[lson].sum + seg[rson].sum ;
	seg[x].maxq = max(seg[lson].maxq, seg[rson].maxq) ;
	seg[x].minq = min(seg[lson].minq, seg[rson].minq) ;
}
void pushdown(int x) {
	if(seg[x].chn) {
		seg[lson].add = seg[rson].add = 0 ;
		seg[lson].sum = (seg[lson].r - seg[lson].l + 1) * seg[x].chn ;
		seg[rson].sum = (seg[rson].r - seg[rson].l + 1) * seg[x].chn ;
		seg[lson].maxq = seg[x].chn ;
		seg[rson].maxq = seg[x].chn ;
		seg[lson].minq = seg[x].chn ;
		seg[rson].minq = seg[x].chn ;
		seg[lson].chn = seg[rson].chn = seg[x].chn ;
		seg[x].chn = 0 ;
	}
	if(seg[x].add) {
		seg[lson].add += seg[x].add ;
		seg[rson].add += seg[x].add ;
		seg[lson].sum += (seg[lson].r - seg[lson].l + 1) * seg[x].add ;
		seg[rson].sum += (seg[rson].r - seg[rson].l + 1) * seg[x].add ;
		seg[lson].maxq += seg[x].add ;
		seg[rson].maxq += seg[x].add ;
		seg[lson].minq += seg[x].add ;
		seg[rson].minq += seg[x].add ;
		seg[x].add = 0 ;
	}
}
void update(int x, int l, int r, int d) {
	seg[x].maxq += d ;
	seg[x].minq += d ;
	if(l <= seg[x].l && seg[x].r <= r) {
		seg[x].sum += (seg[x].r - seg[x].l + 1) * d ;
		seg[x].add += d ;
		return ;
	}
	pushdown(x) ;
	int mid = (seg[x].l + seg[x].r) >> 1 ;
	if(l <= mid) update(lson, l, r, d) ;
	if(mid < r) update(rson, l, r, d) ;
	seg[x].sum = seg[lson].sum + seg[rson].sum ;
}
void change(int x, int l, int r, int d) {
	seg[x].maxq = d ;
	seg[x].minq = d ;
	if(l <= seg[x].l && seg[x].r <= r) {
		seg[x].sum = (seg[x].r - seg[x].l + 1) * d ;
		seg[x].add = 0 ;
		seg[x].chn = d ;
		return ;
	}
	pushdown(x) ;
	int mid = (seg[x].l + seg[x].r) >> 1 ;
	if(l <= mid) change(lson, l, r, d) ;
	if(mid < r) change(rson, l, r, d) ;
	seg[x].sum = seg[lson].sum + seg[rson].sum ;
}
int query(int x, int l, int r) {
	if(l <= seg[x].l && seg[x].r <= r)
		return seg[x].sum;
	pushdown(x) ;
	int mid = (seg[x].l + seg[x].r) >> 1 ;
	int ans = 0 ;
	if(l <= mid) ans += query(lson, l, r) ;
	if(mid < r) ans += query(rson, l, r) ;
	return ans ;
}
int querymax(int x, int l, int r) {
	if(l <= seg[x].l && seg[x].r <= r)
		return seg[x].maxq;
	pushdown(x) ;
	int mid = (seg[x].l + seg[x].r) >> 1 ;
	int ans = -0x3f3f3f3f ;
	if(l <= mid) ans = max(ans, querymax(lson, l, r)) ;
	if(mid < r) ans = max(ans, querymax(rson, l, r)) ;
	return ans ;
}
int querymin(int x, int l, int r) {
	if(l <= seg[x].l && seg[x].r <= r)
		return seg[x].minq;
	pushdown(x) ;
	int mid = (seg[x].l + seg[x].r) >> 1 ;
	int ans = 0x3f3f3f3f ;
	if(l <= mid) ans = min(ans, querymin(lson, l, r)) ;
	if(mid < r) ans = min(ans, querymin(rson, l, r)) ;
	return ans ;
}
int main() {
	//freopen("test.in","r",stdin) ;
	//freopen("ans.txt","w",stdout) ;
	int q, l, r, d ;
	cin >> n >> m ;
	for(int i = 1; i <= n; i++)
		cin >> a[i] ;
	build(1, 1, n) ;
	while(m--) {
		cin >> q;
		if(q == 1) cin >> l >> r >> d, update(1, l, r, d) ;
		if(q == 2) cin >> l >> r, cout << query(1, l, r) << endl ;
		if(q == 3) cin >> l >> r >> d, change(1, l, r, d) ;
		if(q == 4) cin >> l >> r, cout << querymax(1, l, r) << endl;
		if(q == 5) cin >> l >> r, cout << querymin(1, l, r) << endl ;
	}
	return 0 ;
}
2022/2/10 16:04
加载中...