(下截题解)
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 的最小值以达到最大化的目的
是怎么保证取的最大值坐标一定大于最小值坐标的???