因为一个&&导致的segmentation fault,求大佬解答
查看原帖
因为一个&&导致的segmentation fault,求大佬解答
701790
ligg楼主2022/11/24 16:43

因为一个if语句所有点segmentation fault了 modify2函数里面的

if (tr[u].l >= l && tr[u].r <= r && tr[u].maxa > v && v > tr[u].sec)

改成

if (tr[u].r < l || tr[u].l > r || v >= tr[u].maxa) return;
	if (tr[u].l >= l && tr[u].r <= r && v > tr[u].sec)

就能过,只要tr[u].maxa > v && v > tr[u].sec连着写就会错,没理解,想不通,求大佬救救

以下是源代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

typedef long long LL;

const int N = 5e5 + 10, INF = 0x3f3f3f3f;

int n, m;
int w[N];
struct Node 
{
	int l, r;
	int add1, add2, add3, add4;
	int maxa, maxb, sec, cnt;
	LL sum;
} tr[N * 4];

void pushup(int u)
{
	tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
	tr[u].maxb = max(tr[u << 1].maxb, tr[u << 1 | 1].maxb);
	if (tr[u << 1].maxa == tr[u << 1 | 1].maxa)
	{
		tr[u].maxa = tr[u << 1].maxa;
		tr[u].sec = max(tr[u << 1].sec, tr[u << 1 | 1].sec);
		tr[u].cnt = tr[u << 1].cnt + tr[u << 1 | 1].cnt;
	}
	else if (tr[u << 1].maxa > tr[u << 1 | 1].maxa)
	{
		tr[u].maxa = tr[u << 1].maxa;
		tr[u].sec = max(tr[u << 1].sec, tr[u << 1 | 1].maxa);
		tr[u].cnt = tr[u << 1].cnt;
	}
	else 
	{
		tr[u].maxa = tr[u << 1 | 1].maxa;
		tr[u].sec = max(tr[u << 1].maxa, tr[u << 1 | 1].sec);
		tr[u].cnt = tr[u << 1 | 1].cnt;
	}
}

void update(int u, int a1, int a2, int a3, int a4)
{
	tr[u].sum += (LL)a1 * tr[u].cnt + (LL)a2 * (tr[u].r - tr[u].l + 1 - tr[u].cnt);
	tr[u].maxb = max(tr[u].maxb, tr[u].maxa + a3);
	tr[u].add3 = max(tr[u].add3, tr[u].add1 + a3);//
	tr[u].maxa += a1, tr[u].add1 += a1;
	tr[u].add4 = max(tr[u].add4, tr[u].add2 + a4);
	if (tr[u].sec != -INF) tr[u].sec += a2;
	tr[u].add2 += a2; 
}

void pushdown(int u)
{
	int maxn = max(tr[u << 1].maxa, tr[u << 1 | 1].maxa);
	if (tr[u << 1].maxa == maxn)//如果左儿子是最大值区间
		update(u << 1, tr[u].add1, tr[u].add2, tr[u].add3, tr[u].add4);
	else update(u << 1, tr[u].add2, tr[u].add2, tr[u].add4, tr[u].add4);

	if (tr[u << 1 | 1].maxa = maxn)
		update(u << 1 | 1, tr[u].add1, tr[u].add2, tr[u].add3, tr[u].add4);
	else update(u << 1 | 1, tr[u].add2, tr[u].add2, tr[u].add4, tr[u].add4);

	tr[u].add1 = tr[u].add2 = tr[u].add3 = tr[u].add4 = 0;
}

void build(int u, int l, int r)
{
	tr[u].add1 = tr[u].add2 = tr[u].add3 = tr[u].add4 = 0;
	tr[u] = {l, r};
	if (l == r) 
	{
		tr[u].sum = tr[u].maxa = tr[u].maxb = w[l];
		tr[u].sec = -INF, tr[u].cnt = 1;
		return;
	}
	int mid = l + r >> 1;
	build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
	pushup(u);

}

void modify1(int u, int l, int r, int v)
{
	if (tr[u].l >= l && tr[u].r <= r)
	{
		update(u, v, v, v, v);
		return;
	}
	pushdown(u);
	int mid = tr[u].l + tr[u].r >> 1;
	if (l <= mid) modify1(u << 1, l, r, v);
	if (r > mid) modify1(u << 1 | 1, l, r, v);
	pushup(u);
}

void modify2(int u, int l, int r, int v)
{
	if (tr[u].l >= l && tr[u].r <= r && tr[u].maxa > v && v > tr[u].sec)
	{
		update(u, v - tr[u].maxa, 0, v - tr[u].maxa, 0);
		return;
	}
	pushdown(u);
	int mid = tr[u].l + tr[u].r >> 1;
	if (l <= mid) modify2(u << 1, l, r, v);
	if (r > mid) modify2(u << 1 | 1, l, r, v);
	pushup(u);
}

LL query1(int u, int l, int r)
{
	if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum;

	pushdown(u);
	int mid = tr[u].l + tr[u].r >> 1;
	LL v = 0;
	if (l <= mid) v = query1(u << 1, l, r);
	if (r > mid) v += query1(u << 1 | 1, l, r);
	return v;
}

int query2(int u, int l, int r)
{
	if (tr[u].l >= l && tr[u].r <= r) return tr[u].maxa;

	pushdown(u);

	int mid = tr[u].l + tr[u].r >> 1;
	int v = -INF;
	if (l <= mid) v = query2(u << 1, l, r);
	if (r > mid) v = max(v, query2(u << 1 | 1, l, r));

	return v;
}

int query3(int u, int l, int r)
{
	if (tr[u].l >= l && tr[u].r <= r) return tr[u].maxb;

	pushdown(u);
	int mid = tr[u].l + tr[u].r >> 1;
	int v = -INF;
	if (l <= mid) v = query3(u << 1, l, r);
	if (r > mid) v = max(v, query3(u << 1 | 1, l, r));

	return v;
}

int main()
{
	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);

	build (1, 1, n);

	while (m -- )
	{
		int op, l, r, v;
		scanf("%d%d%d", &op, &l, &r);

		if (op == 1)
		{
			scanf("%d", &v);
			modify1(1, l, r, v);
		}
		else if (op == 2) 
		{
			scanf("%d", &v);
			modify2(1, l, r, v);
		}
		else if (op == 3)
		{
			printf("%lld\n", query1(1, l, r));
		}
		else if (op == 4)
		{
			printf("%d\n", query2(1, l, r));
		}
		else if (op == 5)
		{
			printf("%d\n", query3(1, l, r));
		}
	}
	return 0;
}
2022/11/24 16:43
加载中...