/******************************************************** 题目: Wool(hdu 5720) 链接: http://acm.hdu.edu.cn/showproblem.php?pid=5720 解法: 考虑三角形三条边a,b,c (a≥b)的关系a−b<c,a+b>c 即c∈(a−b,a+b) 。 令加入的边为c,枚举所有边作为a的情况。对于所有 可行的b,显然与a相差最小的可以让(a−b,a+b)覆盖范 围最大,所以可以贪心地选择不大于a的最大的b。于 是我们可以先将边按长度排序,然后ai和ai+1建一条 线段,每建立一条线段都要去重。线段并是不合法的 部分。 *********************************************************/ #include<iostream> #include<cstdio> #include<algorithm> #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; const int mx=100005; long long a[mx]; struct T { long long l,r; bool operator < (const T &b) const { return r<b.r; } }; priority_queue<T>q; void f(T t) { if (q.empty()) { q.push(t); return ; } T s=q.top(); q.pop(); if (s.r>=t.l) { t.l=min(s.l,t.l); f(t); return ; } q.push(t); q.push(s); } int main() { int t; scanf("%d",&t); while (t--) { T t; long long n,l,r; scanf("%I64d%I64d%I64d",&n,&l,&r); for (int i=1;i<=n;i++) scanf("%I64d",&a[i]); sort(a+1,a+n+1); long long b,c; for (int i=2;i<=n;i++) { b=max(l,a[i]-a[i-1]+1); c=min(r,a[i]+a[i-1]-1); if (b>c) continue; t.l=b; t.r=c; f(t); } long long ans=0; while (!q.empty()) { t=q.top(); q.pop(); ans+=(t.r-t.l+1); } printf("%I64d\n",r-l+1-ans); } }