对所有的边排序,然后两两组合,注意从大的往小的组合,如 1,2,3,4 那么所有组合 4与3,4与2,4与1,3与2,3与1,2与1 我们看枚举4的时候,明显4与最近的3
组合的时候覆盖范围最大既(4-3,4+3),则4与2,4与1都不用考虑。依次可以枚举边贪心的选出范围,然后在 [ L,R ]范围内求出要的答案。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll inf=1e9;
const ll mod=998244353;
ll a[maxn];
struct node{
ll x,y;
bool operator<(node zz)const {
if(x==zz.x)return y<zz.y;
return x<zz.x;
}
}b[maxn];
ll siz;
ll n;ll L,R;
ll cal(ll la,ll lb){
ll tmp=min(lb,R)-max(la,L)+1;
return tmp<0?0:tmp;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
siz=0;
scanf("%I64d%I64d%I64d",&n,&L,&R);
for(int i=0;i<n;i++){
scanf("%I64d",&a[i]);
}
sort(a,a+n);
for(int i=1;i<n;i++){
b[siz++]=node{a[i]-a[i-1],a[i]+a[i-1]};
}
sort(b,b+siz);
ll la=b[0].x,lb=b[0].y;
ll ans=0;
if(la>=L)ans+=cal(L,la);
for(int i=1;i<siz;i++){
if(b[i].x==la){
lb=b[i].y;
continue;
}
if(b[i].x<lb){
lb=max(lb,b[i].y);
continue;
}
ans+=cal(lb,b[i].x);
la=b[i].x;
lb=b[i].y;
}
if(lb<=R)ans+=cal(lb,R);
printf("%I64d\n",ans);
}
return 0;
}