传送门
本题主要是利用对称性减少码量,首先注意到我们可以把从
(
0
,
0
)
(0,0)
(0,0)出发的六条射线画出来,大致如下图所示:
不难发现,我们可以从起点的六条射线之一出发,然后走到终点的六条射线之一,再顺着终点的射线走到终点。因此两个点的射线之间的交点显得尤为重要。
由于终点不固定,我们考虑终点的射线与起点的射线相交的情况,然后根据对称性,我们先只考虑终点的 ② 、 ⑥ ②、⑥ ②、⑥类型的射线与起点射线的相交情况,也就是我们只考虑这样的一条路径:从起点出发,经过起点的六条射线之一走到某个与终点 ② 、 ⑥ ②、⑥ ②、⑥类型的射线的交点,然后经过终点的 ② 、 ⑥ ②、⑥ ②、⑥类型的射线到达终点。
我们可以简单的分类讨论从而计算出上述情况的答案。
利用对称性,我们对整个坐标系向右旋转 6 0 。 60^。 60。,自然地 c c c的值也要旋转一下, x , y x,y x,y的值也要改变一下,容易发现 ( x ′ , y ′ ) = ( y , y − x ) (x',y')=(y,y-x) (x′,y′)=(y,y−x),然后我们再按刚才的方式求一下答案。旋转三次我们就能够求出所有情况的答案。取个max即可。
ll c[6],cc[6],x,y;
ll work(ll x,ll y){
ll ans=INF;
if(x<=0){
if(y<=x){
ans=min(ans,abs(x-y)*c[4]+c[3]*abs(x));
}else{
ans=min(ans,abs(x-y)*c[1]+c[3]*abs(x));
}
if(y<=0)ans=min(ans,abs(y)*c[4]+c[2]*abs(x));
else ans=min(ans,abs(y)*c[1]+c[2]*abs(x));
}else{
if(y<=x){
ans=min(ans,abs(x-y)*c[4]+c[0]*abs(x));
}else{
ans=min(ans,abs(x-y)*c[1]+c[0]*abs(x));
}
if(y<=0)ans=min(ans,abs(y)*c[4]+c[5]*abs(x));
else ans=min(ans,abs(y)*c[1]+c[5]*abs(x));
}
return ans;
}
void rotate(){
ll t=y;
y-=x;
x=t;
FOR(i,0,6)c[i]=cc[((i+1)%6+6)%6];
FOR(i,0,6)cc[i]=c[i];
}
int main(){
int t=rd();
while(t--){
x=rd(),y=rd();
FOR(i,0,6)c[i]=rd();
if(!x && !y){
wrn(0);
continue;
}
FOR(i,0,6)cc[i]=c[i];
ll ans=INF;
ans=min(ans,work(x,y));
rotate();
ans=min(ans,work(x,y));
rotate();
ans=min(ans,work(x,y));
printf("%lld\n",ans);
}
}