1 条题解

  • 0
    @ 2025-7-19 23:15:55

    注意到区间变长时 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;
    }
    
    • 1

    信息

    ID
    63
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    2
    已通过
    2
    上传者