题解
我们知道,三角形成立的条件是任意两边之和都要大于第三边,因为这里已经明确了三条边的大小关系,即 \(x\leq y\leq z\)
所以,该三角形成立的条件是 \(x+y>z\)
看到 \(5e5\) 我们不难想到遍历其中某条边的长度
这里我遍历的是 \(y\)
遍历 \(y\),找到最小的 \(x\) 使得至少存在一个 \(z\) 使得三角形合法
然后 \(x\) 每加一,合法的 \(z\) 个数就加一,所以我们预处理每加一个 \(x\) ,合法的 \(z\) 的总数
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll pmt[500045]={0};
void solve()
{
ll a,b,c,d;
cin>>a>>b>>c>>d;
ll len=d-c+1;
for(ll i=1;i<=5e5+2;i++)
{
pmt[i]=pmt[i-1]+min(i,len);
}
ll ans=0;
for(ll i=b;i<=c;i++)
{
ll pos=c+1LL-i;
if(pos<=b)
{
if(pos>=a) ans+=pmt[b-pos+1];
else ans+=pmt[b-pos+1]-pmt[a-pos];
}
}
cout<<ans;
}
int main()
{
int t=1;
//cin>>t;
while(t--) solve();
return 0;
}
标签:Count,pmt,遍历,ll,pos,ans,三角形,Triangles
From: https://www.cnblogs.com/pure4knowledge/p/18295652