テスターのふっぴーさん - yukicoder No. 1034

ソースコード
https://yukicoder.me/submissions/469576


f:id:tac_12:20200425151738p:plain:w300


n =  N_{i}, y =  I_{i}, x =  J_{i} とする


何周したかは, mi = min({y, n - 1- y, x, n - 1 - x})


その分のマス数は
a(k) = 2 * k + 2 * (k - 2) : 1 辺の長さが k のときの 1 周のマス数
として,
a(n) + a(n - 2) + ... + a(n - 2 * (mi - 1))


a(i) - a(i - 1) = 4 より, 等差数列の和
(項数) / 2 * (初項 + 末項)


あとは 4 回以内残った外周を動けば見つかる

別解 (公式解説)

ソースコード
https://yukicoder.me/submissions/468887


k 周したとして, そのマス数を求める


上に書いた等差数列の和
k / 2 * ( a(n) + a(n - 2 * (k - 1)) )  \ \ \ \ (1)


a(n) = 2 * n + 2 * (n - 2) = 2 * (2n - 2)
a(n - 2 * (k - 1)) = 2 * (n - 2 * (k - 1)) + 2 * (n - 2 * (k - 1) - 2))
= 2 * (n - 2 * (k - 1) + n - 2 * (k - 1) - 2)
= 2 * (2n - 4(k - 1) - 2)


(1) = k * (2n - 2 + 2n - 4(k - 1) - 2)
= k * (4n - 4(k - 1) - 4)
= 4k(n - k)


f:id:tac_12:20200425155206p:plain:w300


そのあと残ったマスの外周に沿って右下のマスに行く
今左上にいるから, 右に行って下に行く


1 辺の長さは n - 2k
n - 2k - 1 動くから, 2 * (n - 2k - 1)


そっから戻るか進むか


y = x の線より右上 (y < x) なら戻る


何周かした分を除いた外周なので, 単純に座標の差を見ればいい
((n - 1 - k) - y) + ((n - 1 - k) - x)