萌新刚刚学线段树,没有输出

P4513 小白逛公园

YGW6 @ 2023-10-29 11:02:49


#include<bits/stdc++.h>

using namespace std;

const int N = 1e5+5;

int n,m;

struct segment_tree
{
    int l, r;
    int lm, rm;
    int sum, tmax;
}t[N * 4];

void push_up (int u)
{
    t[u].lm = max (t[2 * n].lm, t[2 * n].sum + t[2 * n].lm);
    t[u].rm = max (t[2 * n + 1].rm, t[2 * n].sum + t[2 * n].rm);
    t[u].sum = t[2 * n].sum + t[2 * n + 1].sum;
    t[u].tmax = max (max (t[2 * n].tmax, t[2 * n + 1].tmax), t[2 * n].rm + t[2 * n + 1].lm);
}

void build (int u, int l, int r)
{
    t[u].l = l, t[u].r = r;
    if (l == r)
    {
        scanf ("%d ", &t[u].sum);
        t[u].lm = t[u].rm = t[u].tmax = t[u].sum;
        return ;
    }
    int mid = l + r >> 1;
    build (2 * u, l, mid);
    build (2 * u + 1, mid + 1, r);
    push_up (u);
}

void modify (int u, int x, int v)
{
    if (t[u].l == t[u].r and t[u].l == x)
    {
        t[u].lm = t[u].rm = t[u].tmax = t[u].sum = v;
        return ;
    }
    int mid = t[u].l + t[u].r >> 1;
    if (x <= mid)
        modify (2 * u, x, v);
    else
        modify (2 * u + 1, x, v);
    push_up (u);
}

segment_tree query (int u, int l, int r)
{
    if (t[u].l >= l and t[u].r <= r)
        return t[u];
    int mid = t[u].l + t[u].r >> 1;
    if (r <= mid)
        return query (2 * u,l,r);
    else if (l > mid)
        return query (2 * u + 1, l, r);
    else
    {
        segment_tree tr, t1 = query (2 * u, l, r), t2 = query (2 * u + 1, l, r);
        tr.lm = max (t1.lm, t1.sum + t2.lm);
        tr.rm = max (t2.rm, t1.rm + t2.lm);
        tr.tmax = max (max (t1.tmax, t2.tmax), t1.rm + t2.lm);
        return tr;
    }
}

int main ()
{
    scanf ("%d %d", &n, &m);
    build (1, 1, n);
    for (int i = 1; i <= m; ++ i)
    {
        int op, a, b;
        scanf ("%d %d %d", &op, &a, &b);
        if (a > b)
            swap (a, b);
        if (op == 1)
            printf ("%d\n", query (1, a, b));
        else
            modify (1, a, b);
    }
    return 0;
}

by 半只蒟蒻 @ 2023-10-29 11:14:20

你这个query返回的是 segment 类型,不能直接 printf,你可能需要输出结构体某个成员


by YGW6 @ 2023-10-29 11:15:47

@半只蒟蒻 嗯嗯,发现了,改了,但是只过了一个点


by 半只蒟蒻 @ 2023-10-29 11:26:02

@YGW6 tmax 的更新有问题,考虑把左儿子的rm 和右儿子的 lm 拼在一起时,要考虑一下正负性的问题


by 半只蒟蒻 @ 2023-10-29 11:27:25

@YGW6 就是说,如果两个都是负数的话,就取较大值,否则如果只有一个是正数的话,就取正数,否则可以拼在一起


by YGW6 @ 2023-10-29 11:38:58

@半只蒟蒻

谢谢大佬,我改了一下,AC了;

一个是push_up里变量名的问题,还有就是long long,以及输入里的if,应该写在else里面,和push_up里的各项的下标有点问题,没有找对子树


by 半只蒟蒻 @ 2023-10-29 11:39:32

@YGW6 感觉不需要long long?(


by YGW6 @ 2023-10-29 11:44:08

@半只蒟蒻

嘶~真的不需要……我还因为这个改了半天……悲:(

有劳了,谢谢大佬啦


|