想法-Codeforces-1355C-Count Triangles

题目链接
题意:
给四个正整数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 
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);
}

你可能感兴趣的:(Codeforces,想法)