CF1355C. Count Triangles

Posted zxytxdy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1355C. Count Triangles相关的知识,希望对你有一定的参考价值。

CF1355C. Count Triangles

题意:

给定(A,B,C,D),求(Aleq xleq Bleq yleq C leq zleq 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;
}

以上是关于CF1355C. Count Triangles的主要内容,如果未能解决你的问题,请参考以下文章

CF1355C Count Triangles

CF1354&CF1355 简要题解

CF528E Triangles3000

CF13D Triangles

C. Count Triangles(前缀和)

模板三分——cf1355E