题解/算法 {D - Impartial Gift}
LINK: https://atcoder.jp/contests/abc302/tasks/abc302_d
;
对AB排序后, 用双指针ind
表示B的下标;
i
表示A的元素, 对于i
的元素 此时B数组 pre [mid] suf
其中mid
为abs(i, mid) <= D
的合法点
我们让ind
指向mid
的最后元素, 这是贪心做法, 确实是正确的;
即如下做法:
long long ANS = -1;
int ind = 0;
for( auto i : A){
// MAX_SELF_( ind, 0); // `MARK: @LOC_0`;
while( ind < M){
if( B[ ind] < i - D){ ++ ind; continue;}
if( B[ ind] > i + D) break;
MAX_SELF_( ANS, i + B[ ind]);
++ ind;
}
-- ind;
}
这个代码是有问题的… (思路是对的), 在于你执行的-- ind
这个操作; 假如此时ind=0
那么他会变成ind = -1
, 就出错了; 因此, 你需要特判下: LINK: @LOC_0
;
@DELI;
其实有更简单的做法, 你对i
元素, 使用upper_bound
去B里找第一个> (i + D)
的, 那么前驱元素 就是和i匹配的元素;