トピックリンク:http://codeforces.com/contest/1293/problem/D
質問の意味:
X所与0、Y 0、A X、A Y、B X、B Y
即ちパイル経験点(X 0、Y 0(X)、1、Y 1)(Aに相当するX * X 0 + B X、A Y * Y 0 + B Y)、(X 2、Y 2)(Aと同等であるX * X 1 + B X、A Y * Y 1 + B Y)(X 3、Y 3は()Aに相当するX * X 2 + B X、A Y * Y 2 + B y軸)......
与える所定のX S、Y S、T
すなわち、出発点(X S、Y S)、時刻t
アップとすべてのステップダウンを食べることができる体験パッケージの最大数の先頭から、時刻tにお願いし、時間の1つの単位を取ります
アイデア:
経験点の間の線形関係は、と倍の増加によって(A XおよびA Yがより大きい又は2に等しく、X 0、Y 0、B X、B Yは非負です)
簡単には、連続したパッケージの経験を食べるとベストケースで、i番目のR番目の経験パッケージにコレクト体験パッケージにしたいと仮定想像して、最善のルートは、2つのルートの1つです:
i番目のパケットを体験してポイントを開始し、その後、R番目の経験のパッケージに
i番目のパッケージを体験し、経験のパッケージに出発点目のR
1E16以上53点ので、暴力列挙にはRに開始点と終了点Lに到達するので。
英語の問題の解決策:http://codeforces.com/blog/entry/73051
#include <ビット/ STDC ++ H> に#define LL長い長い 使用して 名前空間STDを、 constの 長い 長い INF = 1E16; 対 <-1,11,11-> P [ 200 ]。 int型のmain() { LL X0、Y0、斧、AY、BX、によって; LL XS、YS、Tすべて = 1 。 CIN >> X0 >> Y0 >>斧>> AY >> BX >> によります。 CIN >> XS >> YS >> トン。 P [ 0 ] = {X0、Y0}。 以下のために(int型私は= 1 ;; I ++ ) { LL NX = P [I- 1 ] 1次回* AX + BX。 LL NY = P [I- 1 ] .second * AY + により、 P [I] = {NX}。 TOT ++ ; もし(NX> INF || NY> INF)ブレーク。 } int型 ANS = 0 ; 以下のために(int型私は= 0 ; I <TOT; I ++ ) { LL DIS = ABS(P [i]が1次回-XS)+ ABS(P [i]の.second- YS)。 以下のための(int型 J = 0 ; jの<トットあり、j ++ ) { もし(DIS + ABS(P [i]が1次回-P [j]が1次回)+ ABS(P [i]は.second-P [J] .second)<= T) { 年 = MAX(年間1つの + ABS(I 、J)); } } } coutの << ANS << てendl; リターン 0 ; }