はまやんはまやんはまやん

hamayanhamayan's blog

Falling Leaves [CSAcademy #56 B]

https://csacademy.com/contest/round-56/task/falling-leaves/

N枚の葉っぱがある。
i番目の葉っぱは、(X[i], Y[i])の座標にあり、毎秒S[i]の速さでy軸逆方向に落ちる。
猫は毎秒Cの速さで原点からx軸方向に移動する。
この時、t=[0,T-1]秒間待ってから出発したときに、葉っぱと衝突する枚数をそれぞれ答えよ。

解法

まず、i番目の葉っぱが丁度衝突するときの出発時刻は計算によって一意に定まる。
なので、全ての葉っぱについて衝突するための出発時刻を計算して、それが[0,T-1]の範囲にある整数なら答えに追加していく。
i番目の葉っぱがt秒待ってから出発して丁度衝突するには、
Y/S=X/C+tを満たせば良い。
これを変形するとt = (YC-SX) / SCとなる。
これが[0,T-1]の整数であれば、答えにインクリメントして、最後に答える。

typedef long long ll;
ll T, C, N, ans[1010];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> T >> C >> N;
    rep(i, 0, N) {
        ll x, y, s; cin >> x >> y >> s;
        
        ll up = y * C - s * x;
        ll dwn = s * C;
        if (0 <= up and up % dwn == 0) {
            ll t = up / dwn;
            if (0 <= t and t < T) ans[t]++;
        }
    }

    rep(i, 0, T) printf("%d\n", ans[i]);
}