题目大意:给出 A B C D ,规定 A <= x <= B <= y <= C <= z <= D ,问 ( x , y , z ) 三元组为三角形的情况有多少种
思路:
三角形三条边为x,y,z;需要满足:x+y>z z-y<x
x,y,z 相对大小已知 只需要满足两个式子中的一个就可以满足这两个式子
我们这里满足 x+y>z
枚举x+y的所有情况 找到符合条件的z
x+y属于[a+b,b+c]; 求出[a+b,b+c]每个数的个数再乘以满足条件的z的个数
枚举x,对于每个x 区间[x+b,x+c]都加一 ,可以用差分
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int N=5e6+10;
ll s[N];
void add(int l,int r)
{
s[l]++;
s[r+1]--;
}
int main()
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
for(int i=a;i<=b;i++)
{
add(i+b,i+c);
}
ll sum=0;
for(int i=a+b;i<=b+c;i++)
{
s[i]+=s[i-1];
if(c<i)
{
sum+=s[i]*(min(i-1ll,(ll)d)-c+1ll);
}
}
cout<<sum<<endl;
}

本文介绍了一种算法,用于解决给定四个边界值ABCD下,寻找满足A<=x<=B<=y<=C<=z<=D且能构成三角形的(x,y,z)三元组数量的问题。通过枚举x+y的所有可能情况,并利用差分技巧计算满足x+y>z条件的z的个数,从而得出所有符合三角形不等式的三元组总数。
609

被折叠的 条评论
为什么被折叠?



