CF1292B Aroma's Search 題解
阿新 • • 發佈:2021-12-16
CF1292B Aroma's Search 題解
以內的點其實並不多,甚至可以說是非常有限。而且可以確定的是,要想經過點最多,一定得要從近的點走到遠的點。所以我們考慮直接暴力模擬,先往左跑,再往右跑,看哪邊能夠經過的點多就取哪一邊的答案。
Content
給定一個座標系,已知第一個點的座標為 \((x_0,y_0)\),第 \(i(i>0)\) 個點的座標滿足這樣的兩個遞推式:\(x_i=a_xx_{i-1}+b_x,y_i=a_yy_{i-1}+b_y\)。現在從 \((x_s,y_s)\) 出發,每秒鐘能夠上下左右走一個格子,求在 \(t\) 秒內最多能夠經過的點的個數。
資料範圍:\(1\leqslant x_0,y_0,x_s,y_s,t\leqslant 10^{16},2\leqslant a_x,a_y\leqslant 100,0\leqslant b_x,b_y\leqslant 10^{16}\)。
Solution
我們發現,座標的增長是指數級的。因此座標在 \(10^{16}\)
依據這種思路寫的程式碼跑的挺快,最慢的點大約也就 \(30\) ms,不用擔心會超時。
Code
long long ax, ay, bx, by, xs, ys, t, x[100007], y[100007]; int main() { getll(x[0]), getll(y[0]), getll(ax), getll(ay), getll(bx), getll(by), getll(xs), getll(ys), getll(t); int num = 0; while(x[num] <= xs + t && y[num] <= ys + t) num++, x[num] = ax * x[num - 1] + bx, y[num] = ay * y[num - 1] + by; ll tmp = 0; int ans = 0; _for(i, 0, num) { tmp = t - llabs(x[i] - xs) - llabs(y[i] - ys); int j = i + 1, cnt = 0; while(tmp >= 0 && j <= num) cnt++, tmp -= (x[j] - x[j - 1] + y[j] - y[j - 1]), j++; cnt += (tmp >= 0), ans = max(ans, cnt), tmp = t - abs(x[i] - xs) - abs(y[i] - ys), j = i - 1, cnt = 0; while(tmp >= 0 && j <= num) cnt++, tmp -= (x[j + 1] - x[j] + y[j + 1] - y[j]), j--; cnt += (tmp >= 0), ans = max(ans, cnt); } writeint(ans); return 0; }