codeforces 1355C. Count Triangles
题意 : 有四个数ABCD,要求满足 A ≤ x ≤ B ≤ y ≤ C ≤ z ≤ D ≤ 5 e 5 A \leq x \leq B \leq y \leq C \leq z \leq D \leq 5e5 A≤x≤B≤y≤C≤z≤D≤5e5 的整数xyz能构成的三角形的个数
思路: 三角形,两边之和大于第三边, x + y ≥ z x + y \geq z x+y≥z
for(x) y ∈ [ m a x ( c − x + 1 , B ) , C ] , z ∈ [ C , m i n ( D , x + y ) ] y \in [max(c-x+1,B),C], z \in [C, min(D,x +y)] y∈[max(c−x+1,B),C],z∈[C,min(D,x+y)]
只枚举x,然后用式子线性算出每个x时候的贡献值,yz各有限制
分类讨论
#include <iostream>
using namespace std;
typedef long long ll;
ll A, B, C, D;
ll ans;
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> A >> B >> C >> D;
for(ll x = A; x <= B; ++ x) {
ll ymin = max(B, C - x + 1);
if(x + C > D){
if(x + ymin > D) {
ans += (C - ymin + 1) * (D - C + 1);
}
else {
ans += (C - D + x) * (D - C + 1) + (D - x - ymin + 1) * (x - C)
+ (D - x - ymin + 1) * (ymin + D - x) / 2;
}
}
else {
ans += (C - ymin + 1) * (x - C) + (C - ymin + 1) * (ymin + C) / 2;
}
}
cout << ans;
return 0;
}