给你一个A,B,C,D并且A<=B<=C<=D问A<=x<=B<=y<=C<=z<=D问x,y,z可以组成多少个三角形。
思路:我们枚举x+y的值。那么z的取值范围就知道了。现在求x+y=i的方案数。
如果x为A,那么y为i-A
如果x为A+1,那么y为i-A-1
...
如果x为B,那么y为i-B
容易观察到y的变化范围为[i-B,i-A]
不过y还需要在[B,C]之内,取区间交就行了
#include <bits/stdc++.h> #define LL long long #define mid (l+r>>1) using namespace std; int main(){ LL a, b, c, d, ans=0; cin>>a>>b>>c>>d; for(LL i=a+b; i<=b+c; i++){ if(i>c){ LL lenc=min(i-c, d-c+1); LL ly=max(b, i-b), ry=min(c, i-a); ans+=lenc*(ry-ly+1); } } cout<<ans<<endl; return 0; }