CF div2 D. Frets On Fire //思维

CF div2 D. Frets On Fire //思维

CF div2 D. Frets On Fire //思维 思维,预设区间全部能填满,找出不能填满的,所以要差值减来减去搞就行了

其实不用离散化,vector左闭右开增加我的劳动量。。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int max_n = 1e5+5;
vector<LL>v;
vector<LL>d;
vector<LL>PA;
int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
       LL sc;scanf("%lld",&sc);v.push_back(sc);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    if(v.size()==1) n=1; //只有一个点
    for(int i=1;i<v.size();i++)d.push_back(v[i]-v[i-1]);
    sort(d.begin(),d.end());
    if(d.size())PA.push_back(d[0]);
    for(int i=1;i<d.size();i++) PA.push_back(d[i]+PA[i-1]);
    int q;scanf("%d",&q);
    while(q--){
        LL a,b;scanf("%lld%lld",&a,&b);
        if(n==1){printf("%lld\n",b+1-a);continue;} //只有一个点
        a=b-a+1;
        int id=upper_bound(d.begin(),d.end(),a)-d.begin();
        LL x;
        if(id==0)  x=PA[PA.size()-1]; //id==0
        else x=PA[PA.size()-1]-PA[id-1];
        x=x-(PA.size()-id)*(a);
        printf("%lld\n",v[v.size()-1]-v[0]+a-x);
    }

    return 0;
}