小问题*玄关*求助!!!
查看原帖
小问题*玄关*求助!!!
1399216
_Gloaming_楼主2024/8/14 09:17

(下截题解)

struct node {
    int maxa;       // a 数组的区间最大值
    int minb;       // b 数组的区间最小值
    int maxab;      // 表示选择区间的两个数 i, j 满足 i < j 且要最大化 ai - bj
    int maxba;      // 表示选择区间的两个数 i, j 满足 i < j 且要最大化 aj - bi
    int res;        // 该区间的答案
};

node pushup(node lc, node rc) {
    node rt;
    rt.maxa = max(lc.maxa, rc.maxa);    // 即左右两个区间的最大值取较大值
    rt.minb = min(lc.minb, rc.minb);    // 即左右两个区间的最小值取较小值
    rt.maxab = max(max(lc.maxab, rc.maxab), lc.maxa - rc.minb);// 即要么直接从子节点取出最大值,要么从左边取出 a 的最大值再减去右边 b 的最小值以达到最大化的目的
    rt.maxba = max(max(lc.maxba, rc.maxba), rc.maxa - lc.minb);// 即要么直接从子节点取出最大值,要么从右边取出 a 的最大值再减去左边 b 的最小值以达到最大化的目的
    rt.res = max(max(lc.res, rc.res), max(lc.maxab + rc.maxa, lc.maxa + rc.maxba));// 即要么直接从子节点取出答案,要么从左边取出 a + b 的最大值再加上右边 a 的最大值或者从左边取出 a 的最大值再加上右边 b + a 的最大值以达到最大化的目的
    return rt
}

这个

rt.maxab = max(max(lc.maxab, rc.maxab), lc.maxa - rc.minb);// 即要么直接从子节点取出最大值,要么从左边取出 a 的最大值再减去右边 b 的最小值以达到最大化的目的
    rt.maxba = max(max(lc.maxba, rc.maxba), rc.maxa - lc.minb);// 即要么直接从子节点取出最大值,要么从右边取出 a 的最大值再减去左边 b 的最小值以达到最大化的目的

是怎么保证取的最大值坐标一定大于最小值坐标的???

2024/8/14 09:17
加载中...