Official

D - く / L Editorial by nuip


解法1

石をくの字に並べる方法それぞれについて、座標ごとの和 \((ax+bx+cx, ay+by+cy)\) を考えます。石の並び方が異なるとき、この値も異なることが次のように示せます。

くの字に並んでいる石のうち真ん中の石の座標を \((x,y)\) とすると、他の石の座標は \(dx,dy\in \{1,-1\}\) を使って、\((x+dx,y), (x,y+dy)\) と表すことができます。このとき、座標ごとの和は\((3x+dx.3y+dy)\) となります。よって、座標の和が \((X,Y)\) であるとき、真ん中の石の \(x\) 座標は \(X/3\) を四捨五入することで計算できることが分かります。\(y\) 座標も同様です。さらに \(dx,dy\) も計算できるため、座標ごとの和からそれぞれの石の座標がわかります。これで証明できました。

よって、座標ごとの和 \((1,1)\)\((ax+bx+cx, ay+by+cy)\) にする問題を解けば良いです。 幅優先探索によって、小さい範囲に対する最短経路を求めてみると、このようになっています。

 7,  , 6, 6,  , 6, 6,  , 6, 6,  , 6, 6,  , 6, 6,  , 6, 6,  , 7,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 7,  , 6, 5,  , 5, 5,  , 5, 5,  , 5, 5,  , 5, 5,  , 5, 6,  , 6,
 7,  , 6, 5,  , 4, 4,  , 4, 4,  , 4, 4,  , 4, 4,  , 5, 5,  , 6,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 7,  , 6, 5,  , 4, 3,  , 3, 3,  , 3, 3,  , 3, 4,  , 4, 5,  , 6,
 7,  , 6, 5,  , 4, 3,  , 2, 2,  , 2, 2,  , 3, 3,  , 4, 5,  , 6,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 7,  , 6, 5,  , 4, 3,  , 2, 1,  , 1, 1,  , 2, 3,  , 4, 5,  , 6,
 7,  , 6, 5,  , 4, 3,  , 2, 1,  , 0, 1,  , 2, 3,  , 4, 5,  , 6,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 7,  , 6, 5,  , 4, 3,  , 2, 2,  , 1, 1,  , 2, 3,  , 4, 5,  , 6,
 7,  , 6, 5,  , 4, 3,  , 3, 2,  , 2, 2,  , 2, 3,  , 4, 5,  , 6,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 7,  , 6, 5,  , 4, 4,  , 3, 3,  , 3, 3,  , 3, 3,  , 4, 5,  , 6,
 7,  , 6, 5,  , 5, 4,  , 4, 4,  , 4, 4,  , 4, 4,  , 4, 5,  , 6,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 7,  , 6, 6,  , 5, 5,  , 5, 5,  , 5, 5,  , 5, 5,  , 5, 5,  , 6,
 7,  , 7, 6,  , 6, 6,  , 6, 6,  , 6, 6,  , 6, 6,  , 6, 6,  , 6,
  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
 8,  , 7, 7,  , 7, 7,  , 7, 7,  , 7, 7,  , 7, 7,  , 7, 7,  , 7,

この表を観察すると、表の値が次のように求められることが分かります。

long long solve(long long x,long long y) {
	x = (x>0 ? x-x/3 : x+(2-x)/3) - 1;
	y = (y>0 ? y-y/3 : y+(2-y)/3) - 1;
	if(x==0 && y==0) return 0;
	if(x==1 && y==1) return 1;
	return max({x,-x,y,-y}) + (x==y);
}

これが正しいことは、それぞれの石の動かし方について、座標ごとの和がどう変化するかを考えて、答えの大きさについて帰納法をすることで証明できます。

C++による実装

posted:
last update: