【Codechef】Chef and Triangles -Problem Code: MAKETRI
题面: 小明已经厌倦了做菜,做菜对他来说太简单了。这天,他决定要挑战一下自己。 他已经选择了 N 根意大利面,准备做一道菜。他还需要选出 一根 意大利面,使得这根意大利面可以和已有的 N 根面中的 某两根构成一个三角形 。选出的意大利面的长度必须在 [L, R] 的范围内。 请你求出小明选择的 方案数 。 输入: 第一行给出N,L,R。 第二行给出N个数len1,len2,...,lenN,表示N个意大利面的长度。 2<=N<=1e6 1<=L,R<=1e18,1<=leni<=1e18 输出: 输出方案数。 样例: Input: 5 1 4 1 2 3 4 5 Output: 3这题卡了我很久。毕竟我之前没做过这一类的题目。题意还是较为简单,不过就是从[L,R]的范围内能选出多少条条边与给出数组中的数凑成三角形。看到数据规模自然是不能暴力的,毕竟O(n2)加上1e6的规模必然会炸。首先毕竟题目是要凑三角形,我们必然就能想到三角形的性质:1.任意两边之和大于第三边2.任意两边之差小于第三边我们假设我们在[L,R]内取了x长度的边,之后又从给出的长度数组A中取了Ai与Aj长度的边。易得到以下的式子:·x + Ai > Aj ——> x > Aj - Ai·x + Aj > Ai ——> x > Ai - Aj·Ai + Aj > x ——> x < Ai +