题意:
给你三个包含n个元素的数组a,b,c,求有多少个三元 < a i , b j , c k > <a_i,b_j,c_k> <ai,bj,ck>满足:
∣ a i − b j ∣ < = c k , ∣ a i − c k ∣ < = b j , ∣ b j − c k ∣ < = a i |a_i-b_j|<=c_k,|a_i-c_k|<=b_j,|b_j-c_k|<=a_i ∣ai−bj∣<=ck,∣ai−ck∣<=bj,∣bj−ck∣<=ai(也就是组成一个允许最长边等于另外两边和的三角形)
题解:
这题的思路和hdu4609差不多,都是先做卷积得到两边和的组成,再枚举最大边去容斥。我们可以枚举最大边在哪个数组,枚举它的长度,利用另外两边和的数组得到所有大于等于当前枚举的边的两边和,但是由于这其中包含了大于等于它的边,所以要减去 两个大于它的边构成的两边和 和 一条边大于它另一条边小于它的两边和。然后答案再加上最大两条边相等,另一条边较小的答案 和 三条边相等的答案。
可以用NTT实现快速卷积,由于有多达100组数据,而n较小的时候用NTT会很慢(因为NTT复杂度是 O ( m a x ( a , b , c ) l o g ( m a x ( a , b , c ) ) ) O(max(