题目链接
题意:
给四个正整数abcd,a≤x≤b≤y≤c≤z≤d
问x y z有多少种选择方式可以组成一个三角形
思路:
x+y可能的值:minn=a+b,maxx=b+c
然后枚举x+y的值
计算x+y取该值时,z可取的数目,x和y可组合成该值的对数
ans += z可取的数目*x和y可组合成该值的对数
求x和y可组合成该值的对数的方法:
x可能的最大值maxxx = min(i - b, b);
x可能的最小值minnx = max(i - c, a);
对数=maxxx - minnx + 1
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll i, j, k, m, n, a, b, c, d;
scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
ll ans = 0;
ll minn = a + b;
ll maxx = b + c;
for (i = minn; i <= maxx; i++)
{
ll cnt1 = i - c;
cnt1 = min(cnt1, d - c + 1);
if (cnt1 <= 0)
continue;
ll maxxx = min(i - b, b);
ll minnx = max(i - c, a);
ans += cnt1 * (maxxx - minnx + 1);
}
printf("%lld\n", ans);
}