注意到区间变长时 min\min 变小而 max\max 变大,因此把 min\min 移到右边后右边有单调性,直接双指针即可。

#include <bits/stdc++.h>
using namespace std;
int x[100012], y[100012], a[300012];
const int PTA = 131071;
int fm(int l, int r, int ii, int aa, int xb)
{
    while (1)
    {
	    if (l == ii && r == aa) return a[xb];
	    int lmid = (ii + aa) >> 1, rmid = lmid + 1;
	    if (l >= rmid)
        {
            ii = rmid;
            xb <<= 1;
            xb++;
            continue;
        }
	    if (r <= lmid)
        {
            aa = lmid;
            xb <<= 1;
            continue;
        }
	    if (r == aa) return max(a[(xb << 1) + 1], fm(l, lmid, ii, lmid, (xb << 1)));
	    if (l == ii) return max(a[(xb << 1)], fm(rmid, r, rmid, aa, (xb << 1) + 1));
	    return max(fm(l, lmid, ii, lmid, (xb << 1)), fm(rmid, r, rmid, aa, (xb << 1) + 1));
    }
}
void gn(int pos, int nval)
{
	int vpos = PTA + pos, spos = vpos;
	a[vpos] = nval;
	while (spos > 1)
    {
        spos >>= 1;
        a[spos] = max(a[(spos << 1)], a[(spos << 1) + 1]);
    }
}
int main()
{
    int n, k;
    int p = 1e9, q = 0;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        cin >> x[i];
    for (int i = 1; i <= n; i++)
        cin >> y[i];
    for (int i = 1; i <= n; i++)
        x[i] += k;
    for (int i = 1; i <= n; i++)
        gn(i, y[i]);
    for (int i = 1; i <= n; i++)
        p = min(p, x[i]);
    for (int i = 1; i <= n; i++)
        q = max(q, y[i]);
    if (q < p)
    {
        puts("-1");
        return 0;
    }
    int ans = n;
    for (int i = 1; i <= n; i++)
    {
        int l = 1, r = n;
        while (l < r)
        {
            int mid = (l + r) >> 1;
            if (fm(max(i - mid + 1, 1), min(i + mid - 1, n), 1, PTA + 1, 1) >= x[i]) r = mid;
            else l = mid + 1;
        }
        ans = min(ans, l);
    }
    cout << ans << endl;
    return 0;
}