思路:每个点对,如果它们在子集中被取到且相邻相向,那它们会对答案产生1的贡献。
然后依次枚举所有点对,并求多少个子集包含这个点对且满足它们相邻且相向的条件。
子集数为:1-L的所有点选或不选,R-n的所有点选或不选。即 2^(len)
L,R为满足这个点对相向的左右两个边界
int a[N];
LL p[N];
void solve()
{
p[0]=1;
for(int i=1;i<3000;++i) {
p[i]=p[i-1]*2%mod;
}
cin>>n;
LL ans=0;
for(int i=0;i<n;++i) cin>>a[i];
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
int d=a[j]-a[i];
int l=lower_bound(a,a+n,a[i]-d)-a-1;
int r=lower_bound(a,a+n,a[j]+d)-a;
ans=(ans+p[n-r+l+1])%mod;
}
}
cout<<ans<<endl;
}