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的主要内容,如果未能解决你的问题,请参考以下文章