因为一个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;
}