给定 个数, 次询问,每次询问区间中 的最小值。
Constraints
, ,
Solution
对于每一个 ,考虑所有满足 且 的可能可以成为答案的 ( 的情况可以用同样的方式处理)。假设当前已经找到了一对 ,则下一个合法的位置 需要满足 且 ,即每次需要查询区间 内的第一个满足 的 ,可以将数字从大到小加入线段树后直接查询。由于 每次至少减少一半,所以最多有 对 。
得到所有合法的 后,可以按 排序后插入树状数组,每次查询左端点。时间复杂度 。
Code
1 |
|
Living is do or die.
给定 n 个数, m 次询问,每次询问区间中 ∣ai−aj∣ 的最小值。
2≤n≤105 ,0≤ai≤109 ,1≤m≤3⋅105
对于每一个 i ,考虑所有满足 j>i 且 aj≤ai 的可能可以成为答案的 j(aj≥ai 的情况可以用同样的方式处理)。假设当前已经找到了一对 (i,j),则下一个合法的位置 k 需要满足 ak<aj 且 ak−ai<aj−ak,即每次需要查询区间 [j+1,n] 内的第一个满足 ai≤ak<2ai+aj 的 k,可以将数字从大到小加入线段树后直接查询。由于 aj−ai 每次至少减少一半,所以最多有 O(nloga)对(i,j) 。
得到所有合法的 (i,j) 后,可以按 j 排序后插入树状数组,每次查询左端点。时间复杂度 O((nloga+m)logn) 。
1 | #include<cstdio> |