codeforces 1355C. Count Triangles

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 AxByCzD5e5 的整数xyz能构成的三角形的个数

思路: 三角形,两边之和大于第三边, x + y ≥ z x + y \geq z x+yz

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(cx+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;
}

猜你喜欢

转载自blog.csdn.net/qq_39602052/article/details/113109289