第一个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; }