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;
}