题解:AT_abc388_g [ABC388G] Simultaneous Kagamimochi 2
显然二分。考虑 check
根据 E 的思路,显然要把
注意到如果第
预处理
判断「对于所有
int n, a[N], p[N];
int st[N][20];
int query(int l, int r) {
int k = log2(r - l + 1);
return max(st[l][k], st[r - (1 << k) + 1][k]);
}
bool chk(int l, int r, int k) {
return query(l, l + k - 1) <= r - l + 1 - k;
}
void Luogu_UID_748509() {
cin >> n;
for (int i = 1; i <= n; ++ i ) {
cin >> a[i];
}
for (int i = 1; i <= n; ++ i ) {
p[i] = lower_bound(a + i + 1, a + n + 1, a[i] * 2) - a;
if (p[i] == n + 1) p[i] = 1e9;
// cout << i << " : " << p[i] << '\n';
p[i] -= i;
st[i][0] = p[i];
}
for (int j = 1; j < 20; ++ j )
for (int i = 1; i + (1 << j - 1) <= n; ++ i )
st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
int q;
cin >> q;
while (q -- ) {
int l, r;
cin >> l >> r;
int lo = 1, hi = (r - l + 1) / 2, res = 0;
while (lo <= hi) {
int mid = lo + hi >> 1;
if (chk(l, r, mid)) res = mid, lo = mid + 1;
else hi = mid - 1;
}
cout << res << '\n';
}
}