CF1355C. Count Triangles

CF1355C. Count Triangles

题意:

给定\(A,B,C,D\),求\(A\leq x\leq B\leq y\leq C \leq z\leq D\),有多少个\(x,y,z\)组成三角形。

思路:

这题有个很好的性质,就是因为限定了每个边的取值范围,所以\(y+z\)一定大于\(x\)\(x+z\)一定大于\(y\),所以我们只需要考虑\(x+y>z\)这样的情况。

肯定不能枚举\(x,y\),所以换了一个思路,考虑枚举\(x+y\)

那么显然对于一个\(x+y=num\),他能取到的\(z\)\(min\{num-C,D-C+1\}\)那么多个。

之后我们只需要找到\(num\)对于\(x,y\)的拆分。

假设说,如果\(num=A+B+2\),那么我们的拆分就是三个:\((A,B+2),(A+1,B+1),(A+2,B)\)

所以可以想到思路,就是在限制条件下,\(B\)可以的增加范围,也就是一段区间。

求这段区间的长度。

很显然\(B\)最多可以加到\(C\),之后来确定下界。

\(cnt\)\(A\)最多可以加到的数,那么\(num-cnt\)就是\(B\)可以加到的下界(因为\(A\)加的最多,所以\(B\)取到最小)。

void solve()
{
    ll A, B, C, D;
    cin>>A>>B>>C>>D;
    ll ans = 0;
    ll dow = max(C+1, A+B);
    for(ll i = dow; i <= B+C; i++)
    {
        ll t1 = i-A, t2 = i-B;

        if(t1 > C) t1 = C;
        if(t2 > B) t2 = B;

        t2 = i-t2;

        ll tt = min(i-C, D-C+1);
        ans += (t1-t2+1)*tt;
    }
    cout << ans << endl;
}

猜你喜欢

转载自www.cnblogs.com/zxytxdy/p/12904723.html
今日推荐