#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=100010;
const int mod=100000000;
const int MOD1=1000000007;
const int MOD2=1000000009;
const double EPS=0.00000001;
typedef long long ll;
const ll MOD=1000000007;
const int INF=1000000010;
const double pi=acos(-1.0);
typedef double db;
typedef unsigned long long ull;
int f[5*N];
ll a[N],c[5*N],d[5*N];
int main()
{
int i,k,g,n,t,w,u,v;
ll l,r,ans;
scanf("%d", &t);
while (t--) {
memset(d,0,sizeof(d));
scanf("%d%I64d%I64d", &n, &l, &r);
for (i=1;i<=n;i++) scanf("%I64d", &a[i]);
sort(a+1,a+n+1);
k=0;d[++k]=l;d[++k]=r+1;
for (i=1;i<n;i++) {
if (a[i+1]-a[i]>=l) d[++k]=a[i+1]-a[i]+1;
if (a[i+1]+a[i]<=r) d[++k]=a[i+1]+a[i];
}
sort(d+1,d+k+1);
g=unique(d+1,d+k+1)-(d+1);
for (i=1;i<=k;i++) c[lower_bound(d+1,d+g+1,d[i])-d]=d[i];
u=lower_bound(d+1,d+g+1,l)-d;
v=lower_bound(d+1,d+g+1,r+1)-d;
memset(f,0,sizeof(f));
for (i=1;i<n;i++) {
if (a[i+1]-a[i]>=l) {
if (a[i+1]-a[i]>r) {
f[u]++;f[v]--;
} else {
w=lower_bound(d+1,d+g+1,a[i+1]-a[i]+1)-d;
f[u]++;f[w]--;
}
}
if (a[i+1]+a[i]<=r) {
if (a[i+1]+a[i]<l) {
f[u]++;f[v]--;
} else {
w=lower_bound(d+1,d+g+1,a[i+1]+a[i])-d;
f[w]++;f[v]--;
}
}
}
for (i=1;i<=g;i++) f[i]+=f[i-1];
ans=0;
for (i=1;i<g;i++)
if (f[i]==n-1) ans+=c[i+1]-c[i];
printf("%I64d\n", ans);
}
return 0;
}
代码:
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=100010;
const int mod=100000000;
const int MOD1=1000000007;
const int MOD2=1000000009;
const double EPS=0.00000001;
typedef long long ll;
const ll MOD=1000000007;
const int INF=1000000010;
const double pi=acos(-1.0);
typedef double db;
typedef unsigned long long ull;
ll a[N];
int main()
{
int i,n,t;
ll l,r,L,R,ans;
scanf("%d", &t);
while (t--) {
scanf("%d%I64d%I64d", &n, &L, &R);
for (i=1;i<=n;i++) scanf("%I64d", &a[i]);
sort(a+1,a+n+1);ans=0;
for (i=n-1;i;i--) {
l=a[i+1]-a[i]+1;
r=a[i]+a[i+1]-1;
if (l>R||r<L) continue ;
if (R>r) ans+=R-r;
R=l-1;if (L>R) break ;
}
if (L<=R) ans+=R-L+1;
printf("%I64d\n", ans);
}
return 0;
}