codeforces 1119 D. Frets On Fire

题意:略

先给a排序。然后做差记在b数组,b排序,记录b数组前缀和。询问时利用了等长(记询问区间宽度w)的性质,重叠部分不相交。那么做差<w的两个位置相交,>w的不相交。然后发现不交的部分和前缀和有关。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
#define err cout<<"err"<<endl
using namespace std;
const double EPS=1e-8;
typedef long long lon;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const lon SZ=100010,SSZ=SZ*SZ,APB=4,one=1;
const lon INF=0x3f3f3f3f,mod=1000000007;
lon n,a[SZ],b[SZ],sum[SZ];

void init()
{
    cin>>n;
    for(lon i=1;i<=n;++i)cin>>a[i];
    sort(a+1,a+1+n);
    for(lon i=1;i<=n-1;++i)
    {
        b[i]=a[i+1]-a[i];
    }
    sort(b+1,b+1+n-1);
    for(lon i=1;i<=n-1;++i)
    {
        sum[i]=sum[i-1]+b[i];
    }
    lon qnum;
    cin>>qnum;
    for(lon tim=1;tim<=qnum;++tim)
    {
        lon ll,rr;
        cin>>ll>>rr;
        lon w=rr-ll+1;
        lon res=0;
        lon pos=lower_bound(b+1,b+1+n-1,w)-1-b;
        res=w+sum[pos]+(n-1-pos)*w;
        cout<<res<<endl;
    }
}

void work()
{
    
}

void release()
{
    
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //cout<<casenum<<endl;
    //for(lon tim=1;tim<=casenum;++tim)
    //for(lon tim=1;cin>>n;++tim)
    {
        //cout<<"Case #"<<tim<<": ";
        init();
        work();
        release();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/gaudar/p/11551498.html