公式

B - Polyline 解説 by harurun4635


各 \(i\) について「 \((i, A_i)\) と \((i+1, A_{i+1})\) を結ぶ線分が \(y = K\) となるか?」を数えることにすると、端点について二重に数えてしまう事があることに注意しましょう。


いくつかの解決方法がありますが、「端点」と「そうでない点」を分けて数える方法があります。

「端点」は \(x\) 座標が整数の点ですから、これは「配列 \(A\) に含まれる \(K\) の個数」と一致します。

「そうでない点」は各 \(i\) について \(A_i \lt K \lt A_{i+1}\) もしくは \(A_i \gt K \gt A_{i+1}\) のときに存在します。

それぞれは重複することはありませんから、独立に数えればよいです。


実装例 (Python)

n, k = map(int, input().split())
a = list(map(int, input().split()))

ans = a.count(k) # 端点
for i in range(n - 1):
    if a[i] < k < a[i + 1] or a[i + 1] < k < a[i]:
        ans += 1 # そうでない点

print(ans)