题意:给你一个a数组,a数组每次每个数都加一,有q次查询每一查询加L次到加R次中出现的所有不重复的数字个数。
题解:先将a数组排序,在将a和a+1的差值算出来,然后将差值排序,然后再将差值求前缀和,这个代表在没有增加的情况下有多少个不同的数字,然后每次查询的时候,将前缀和加上增加后的出现的新数字的个数就是答案。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100010];
ll pro[100010];
int main(){
ll n,l,r,q;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
}
sort(a,a+n);
for(int i = 0 ; i < n ; i++){
a[i] = a[i+1]-a[i];
}
sort(a,a+n-1);
for(int i = 0 ; i < n ; i++){
pro[i+1] = a[i] + pro[i];
}
cin>>q;
while(q--){
cin>>l>>r;
ll len = r-l+1;
ll ind = lower_bound(a,a+n-1,len) - a;
cout<<(n-ind)*len+pro[ind]<<" ";
}
}
//10
//13 18 10 3 9 19 20 4 10 5
//1
//3 3