signedmain() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i];
int res = 0; for (int i = 0; i < n; i++) { int l = 0, r = i - 1; while (l < r) { int mid = l + r + 1 >> 1; if (a[mid] * 2 > a[i]) r = mid - 1; else l = mid; } if (a[l] * 2 <= a[i]) res += l + 1; }
cout << res << endl;
return0; }
D. Coming of Age Celebration
对于第 \(i\) 个刚成年的人,假设此时他拥有的石头数量为 \(x\),那么他会向之后 \(min(x, n - i)\) 个人赠送石头,也就是使 \([i + 1, i + min(x, n - i)]\) 这个区间的所有人石头数加一。
cin >> n >> m >> a >> b; for (int i = 1; i <= m; i++) { int l, r; cin >> l >> r; t[i] = {l, r}; }
t[++m] = {n + 1, n + 1}; s.insert(1);
for (int i = 1; i <= m; i++) { for (int j = 1; j <= 20; j++) { if (s.count(t[i].x - j)) continue; for (int k = 1; k <= 20; k++) { if (!s.count(t[i - 1].y + k)) continue; int x = t[i].x - j - t[i - 1].y - k; if (x < 0) continue; int c = x / a, r = x % a; if ((b - a) * c >= r) s.insert(t[i].x - j); } } for (int j = 1; j <= 20; j++) { if (!s.count(t[i].x - j)) continue; if (t[i].x - j <= t[i - 1].y) continue; for (int k = a; k <= b; k++) s.insert(t[i].x - j + k); } }
intquery(int l, int r) { int k = log2(r - l + 1); returnmax(st[l][k], st[r - (1 << k) + 1][k]); }
signedmain() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) { int l = i + 1, r = n; while (l < r) { int mid = l + r >> 1; if (a[mid] / 2 < a[i]) l = mid + 1; else r = mid; } if (a[l] / 2 >= a[i]) st[i][0] = l - i; else st[i][0] = n + 1 - i; }
for (int j = 1; j <= 22; 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]);
cin >> m; while (m--) { int l, r; cin >> l >> r; int ll = 0, rr = r - l + 1 >> 1; while (ll < rr) { int mid = ll + rr + 1 >> 1; if (query(l, l + mid - 1) <= r - (l + mid - 1)) ll = mid; else rr = mid - 1; } cout << ll << endl; }