构造
第一个子任务就从外往内两个两个地确定即可。
第二个子任务,发现如果我们类似上面地把每一个数都确定下来,至少也要N/2级别的询问,而询问代价还有一个k,因此不能直接确定所有数字。那就是要忽略一些数字,发现答案的下界是 ⌈an−a1n−1⌉ ,因此把 a1 至 an 每下界长度分一块,块内就不用管了。只有块之间有贡献。
#include "gap.h"
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef double db;
const ll INF = 1000000000000000000ll;
long long findGap(int T, int n)
{
if(T == 1)
{
ll a1, an, l, r, ans = 0;
MinMax(0,INF,&a1,&an);
for(int i = n-2; i > 0; i -= 2)
{
MinMax(a1+1,an-1,&l,&r);
ans = max(ans, max(l-a1, an-r));
a1 = l, an = r;
}
ans = max(ans, an-a1);
return ans;
}
else
{
ll a1, an, down, last, ans = 0, i, l, r;
MinMax(0,INF,&a1,&an); last = a1;
down = (ll)ceil((db)(an-a1)/n);
for(i=a1+1; i+down-1 < an; i += down)
{
MinMax(i,i+down-1,&l,&r);
if(l != -1) ans = max(ans, l-last), last = r;
}
if(i < an)
{
MinMax(i,an-1,&l,&r);
if(l != -1) ans = max(ans, l-last), last = r;
}
ans = max(ans, an - last);
return ans;
}
}