题解
将可用的木棍分为x,y两段
假设 x,y均有值,且x
y
第三段肯定是由b进行分割,分割成a,b两段,即 a+b=y
则有以下不等式:
1.
2.
3.
然后将 b=y-a 带入不等式,得:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll a[N];
int n,m,k;
ll cal(int x,int y){
if(x>=y)return 0;
int l=max(1,(y-x)/2+1);//a的下界 下界至少为1
int r=(y+x)/2;//a的上界
if(!((y+x) & 1)) r--;//注意一下奇偶 偶数还得再减少
r=min(r,y-1);
return max(0,r-l+1);
}
int main(){
ios::sync_with_stdio(0);
while(cin>>n>>m){
for (int i = 1; i <= m; ++i) {
cin>>a[i];
}
ll mi=a[1],mx=a[1];//两个端点
for (int i = 2; i <= m; ++i) {
mi=min(mi,a[i]);
mx=max(mx,a[i]);
}
ll num=0,ans=0;
if(mi>1)num++;//左边有剩余的木棍
if(mx<n)num++;
ll x=min(mi-1,n-mx);//找到两根木棒里最短的那根
ll y=max(mi-1,n-mx);//最长的那根
if(num==2){
if(y>x && x+y>=3){//可以组成三角形
ans+=cal(x,y);
}
}else if(num==1){
if(y>=3){
for (ll i =1 ; i <y ; ++i) {//枚举
ans+=cal(i,y-i);
}
}
}
cout<<ans<<endl;
}
return 0;
}