1 条题解
-
0
注意到区间变长时 变小而 变大,因此把 移到右边后右边有单调性,直接双指针即可。
#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
- 上传者