/********************************************************
题目: 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);
}

}

 

posted on 2016-07-18 10:18  pb2016  阅读(147)  评论(0编辑  收藏  举报