线段树求助
查看原帖
线段树求助
270854
二叉苹果树楼主2022/11/11 23:36

洛谷测出来MLE,本地 modify a 和modify b好像没问题,测到query的时候直接RE了,纯萌新求调!

#include<bits/stdc++.h>
#define MAXN 500005
#define ll long long
#define lc (u << 1)
#define rc (u << 1 | 1)
#define INF 0x3f3f3f3f

int L, R, a[MAXN], b[MAXN];

struct node 
{
    int MaxA, MinB, MaxL, MaxR, ans;
}t[MAXN << 2];

void pushup(int u)
{
    t[u].MaxA = std::max(t[lc].MaxA, t[rc].MaxA);
    t[u].MinB = std::min(t[lc].MinB, t[rc].MinB);
    t[u].MaxL = std::max(t[lc].MaxL, t[rc].MaxL);
    t[u].MaxR = std::max(t[lc].MaxR, t[rc].MaxR);
    t[u].ans = std::max(std::max(t[lc].ans, t[rc].ans), std::max(t[lc].MaxL + t[rc].MaxA, t[lc].MaxA + t[rc].MaxR));
}

void build(int u, int l, int r)
{
    t[u].MaxL = t[u].MaxR = t[u].ans = -INF;
    if(l == r)
    {
        t[u].MaxA = a[l];
        t[u].MinB = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(lc, l, mid);
    build(rc, mid + 1, r);
    pushup(u);
}

void modify_A(int u, int pos, int v,int l, int r)
{
    if(l > pos || r < pos)
        return;
    if(l == r)
    {
        t[u].MaxA = v;
        return ;
    }
    int mid = (l + r) >> 1;
    modify_A(lc, pos, v, l, mid);
    modify_A(rc, pos, v, mid + 1, r);
    pushup(u);
}
void modify_B(int u, int pos, int v,int l, int r)
{
    if(l > pos || r < pos)
        return;
    if(l == r)
    {
        t[u].MinB = v;
        return ;
    }
    int mid = (l + r) >> 1;
    modify_B(lc, pos, v, l, mid);
    modify_B(rc, pos, v, mid + 1, r);
    pushup(u);
}

node query(int u, int l, int r)
{
    if(l > R || r < L)
        return (node){-INF,INF,-INF,-INF,-INF};
    if(l >= L && r <= R)
        return t[u];
    node tl = query(lc, l, r), tr = query(rc, l, r), res;
    res.MaxA = std::max(tl.MaxA, tr.MaxA);
    res.MinB = std::max(tl.MinB, tr.MinB);
    res.MaxL = std::max(tl.MaxL, std::max(tr.MaxL, tl.MaxA - tr.MinB));
    res.MaxR =  std::max(tr.MaxR, std::max(tl.MaxR, tr.MaxA - tl.MinB));
    res.ans = std::max(std::max(tl.ans, tr.ans), std::max(tl.MaxL + tr.MaxA, tr.MaxR + tl.MaxA));
    return res;
}

int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-')
            f = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x * f;
}

int main()
{
    int n = read(), m = read();
    for(int i = 1; i <= n; i++)
        a[i] = read();
    for(int i = 1; i <= n; i++)
        b[i] = read();
    build(1,1,n);
    for(int i = 1; i <= m; i++)
    {
        int opt = read();
        L = read(), R = read();
        if(opt == 1)
            modify_A(1, L, R, 1, n);
        else if(opt == 2)
            modify_B(1, L, R, 1, n);
        else
            printf("%d\n", query(1, 1, n).ans);
    }
    return 0;
}
2022/11/11 23:36
加载中...