Codeforces1355 C. Count Triangles(枚举)

题意:

给定A、B、C、D
给定限定条件A<=x<=B<=y<=C<=z<=D
问有多少个(x,y,z)能组成三角形

数据范围:A,B,C,D<=5e5

解法:

题目即统计满足x+y<z的方案数
容易想到枚举一个,O(1)计算方案数,但是细节有点多,不好码
还有一种做法是枚举x+y,设当前枚举到的x+y为i
那么需要计算的有两个:
1.满足i<z的z的数量,这个非常简单
2.满足x<=y且x+y=i的(x,y)的数量,这个稍微麻烦一点
考虑如何计算2:
如果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]之内,取区间交就行了

code:

#include
using namespace std;
#define int long long
signed main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int ans=0;
    for(int i=a+b;i<=b+c;i++){
        if(i>=c){
            int l=max(i-b,b),r=min(i-a,c);//区间交
            int cnt=min(i-c,d-c+1);
            ans+=cnt*(r-l+1);
        }
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(Codeforces1355 C. Count Triangles(枚举))