题意
给你
问有多少种方法构造出三角形
使得
思路
组成三角形的条件是2边之和大于第三边,这里因为
所以只需要
,所以我们只要知道了
的值之后,可以求出
的可行范围,但分别枚举
肯定会超时,我们换个思路,直接枚举
或者说能得到
的
有多少对,显然当
,所以组成的
的值在
区间,当
,所以组成的
的值在
区间,显然这些区间重叠到一起之后,对于某个点p的取值就是构成
组合个数,然后这部分区间可以通过差分、前缀和求得
,此时得到的
表示构成
的组合对数。然后我们枚举
,对应当前
,所以答案就是
然后这部分的区间值我们同样可以用前缀和来维护,最后
就是答案。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int man = 1e6+10;
#define IOS ios::sync_with_stdio(0)
typedef long long ll;
const ll mod = 1e9+7;
ll sum[man];
int main() {
#ifndef ONLINE_JUDGE
//freopen("in.txt", "r", stdin);
//freopen("out.txt","w",stdout);
#endif
int a,b,c,d;
cin >>a >> b >>c >> d;
for(int i = a;i <= b;i++)sum[i+b]++,sum[i+c+1]--;//区间修改
for(int i = 1;i < man;i++)sum[i]+=sum[i-1];//所有区间加1,重叠地方累加
for(int i = 1;i < man;i++)sum[i]+=sum[i-1];//对x+y的数量求一个前缀和,O(1)得到答案
ll ans = 0;
for(int i = c;i <= d;i++){
ans += sum[man-1] - sum[i];
}
cout << ans << endl;
return 0;
}