一开始正着做很复杂,然后发现补集转化一下就很方便了,随便搞一下…
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
typedef long long LL;
int a,b,c,L,d;
LL ans;
LL get(int a,int b,int c){
int x=min(L+a-d,d-b-c);
return x<0?0:(LL)(x+2)*(x+1)/2;
}
int main(){
freopen("cf571A.in","r",stdin);
freopen("cf571A.out","w",stdout);
scanf("%d%d%d%d",&a,&b,&c,&L); int _max=max(a,max(b,c));
ans=(LL)(L+3)*(L+2)/2*(L+1)/3;
for(d=_max;d<=_max+L;d++){
ans-=get(a,b,c)+get(b,a,c)+get(c,a,b);
//printf("%d: %d\n",d,get(a,b,c)+get(b,a,c)+get(c,a,b));
}
printf("%I64d\n",ans);
return 0;
}

本文提供了一种解决CF571A问题的有效方法,通过计算补集简化了原始问题,利用C++代码实现了解决方案。核心思路在于转换视角,通过计算不满足条件的情况来间接得出答案。
616

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



