[APIO2016]Gap(交互)

第一个subtask应该还是很送分的,就是每次询问两端值的大小,(N+1)/2次即可。

考虑第二个subtask,首先还是先把最小值和最大值询问出来,然后发现不需要询问每一个数,直接将[l+1,r-1]均分成N-1个区间,因为最长区间长度一定不小于平均值,所以应该会跨越两段,若在某一段内有值即可直接统计答案,发现除了头尾其余的点各询问到3次。

#include "gap.h"
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxN=1e5+7;
ll a[maxN];
ll findGap(int T,int N)
{
    if(T==1)
    {
        int l=2,r=N-1;
        MinMax(0,1e18,a+1,a+N);
        while(l<=r)MinMax(a[l-1]+1,a[r+1]-1,a+l,a+r),l++,r--;
        ll ret=0;
        for(int i=2;i<=N;i++)ret=max(ret,a[i]-a[i-1]);
        return ret;
    }
    ll ret=0,mn,mx,len,cur,lst,r;
    MinMax(0,1e18,&mn,&mx);
    len=(mx-mn-1)/N+1,cur=mn+1,lst=mn,r=mx;
    while(cur<=r)
    {
        MinMax(cur,cur+len,&mn,&mx);
        if(mn!=-1)ret=max(ret,mn-lst),lst=mx;
        cur+=len+1;
    }
    return ret;
}
View Code
原文地址:https://www.cnblogs.com/hfctf0210/p/10908485.html