51nod 1509 加长棒 (隔板)

来源:互联网 发布:手机自动切换移动网络 编辑:程序博客网 时间:2024/06/10 03:36
1509 加长棒
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注

现在有三根木棒,他们的长度分别是a,b,c厘米。你可以对他们进行加长(不同的木棒可以增加不同的长度),他们总的加长长度不能超过L厘米。你也可以不对他们进行加长。

现在请你计算一下有多少种加长的方式使得他们能构成合法的三角形(面积非0)。

Input
单组测试数据。共一行,包含4 个整数a,b,c,L (1≤a,b,c≤3*10^5, 0≤L≤3*10^5)。
Output
输出答案占一行。
Input示例
1 1 1 2
Output示例
4

思路:属于L个单位 分为四部分(给a,给b,给 c,剩余),每部分可以为空的情况, 那么 一共有L+3个空位,如果不考虑三角形,公用C(l+3,3)    种情况, 之后去重:
去重的条件是 满足长度限定且不是三角形
x+y+z<=l
a+x+b+y<=c+z
x+y<=min(l-z,c+z-a-b);
那么枚举z的大小可以确定x+y <= k
将这个k再分给x,y 同上, 共有k+2个空位,C(k+2,2)
#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <iostream>using namespace std;typedef long long ll;ll solve(ll a,ll b,ll c,ll l){    ll ans=0;    for(int i=0;i<=l;i++){        ll tmp=min(l-i,c+i-a-b);        if(tmp>=0)  ans+=(tmp+1)*(tmp+2)/2;    }return ans;}int main(){    ll a,b,c,l;    cin>>a>>b>>c>>l;    ll ans=(l+3)*(l+2)*(l+1)/6;    ans-=solve(a,b,c,l);    ans-=solve(a,c,b,l);    ans-=solve(b,c,a,l);    cout<<ans<<endl;}