題意
給你
問有多少種方法構造出三角形使得
思路
組成三角形的條件是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;
}