http://codeforces.com/contest/1119/problem/D
1、每一次询问不考虑重复的话,有个数字,然后考虑有多少个重复的数字,
2、将a排序,如果相邻两个端点的差值小于的话,那么可以认定他们一定有重复的值,否则没有重复的值,不进行第三步
3、重复元素的个数就是
4、所以不重复的元素个数就等于 所有数字 减去 重复数字
5、注意第四点的公式必须要满足第二点,有重复值,即表达式为正,不然不予计算,
6、所以我们要先预处理出所有的,并排序预处理前缀和
7、所以最后的答案就是,其中index是有重复的值的个数。
Code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100005], l, r, pre[100005];
int main()
{
int n, q;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
sort(a + 1, a + 1 + n);
for (int i = 1; i < n; i++)
a[i] = a[i + 1] - a[i];
sort(a + 1, a + n);
for (int i = 1; i < n; i++)
pre[i] = pre[i - 1] + a[i];
scanf("%d", &q);
while (q--)
{
scanf("%lld%lld", &l, &r);
ll num = r - l + 1;
int index = upper_bound(a + 1, a + n, num) - a - 1;
ll ans = num * n - (num * (index) - pre[index]);
printf("%lld\n", ans);
}
}