[yukicoder] No. 871 かえるのうた

問題

方針

\( x \) 座標の正の方向と負の方向に向かって声が届く範囲を更新していきます。一方向に対して更新していくのではなく、同時に両方向に更新していくことがポイントです。

正の方向と負の方向に対してそれぞれ添え字を更新し、範囲も更新してくことで答えが導けます。

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    int N, K;
    cin >> N >> K;
    ll X[N], A[N];
    for (int i = 0; i < N; i++) {
        cin >> X[i];
    }
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
    K--;
    ll r = X[K] + A[K];
    ll l = X[K] - A[K];
    int idr = K + 1;
    int idl = K - 1;
    int cnt = 1;
    while (idr < N || idl >= 0) {
        if (idr < N && X[idr] <= r) {
            r = max(r, X[idr] + A[idr]);
            l = min(l, X[idr] - A[idr]);
            cnt++;
            idr++;
        } else if (idl >= 0 && l <= X[idl]) {
            r = max(r, X[idl] + A[idl]);
            l = min(l, X[idl] - A[idl]);
            cnt++;
            idl--;
        } else {
            break;
        }
    }
    cout << cnt << "\n";
  return 0;
}