A - Dot Product Editorial
by
sounansya
\(\displaystyle C_i=\frac{A_i}{B_i}\) とします。
もし \(C_1,C_2,\ldots,C_N\) の値が全て同じなら答えは No です。これは、 \(C=C_i>0\) とすると \(\displaystyle \sum_{i=1}^N A_iX_i=C\sum_{i=1}^N B_iX_i\) より \(\displaystyle \sum_{i=1}^N A_iX_i\) と \(\displaystyle \sum_{i=1}^N B_iX_i\) の符号は常に同じになるからです。
逆に、\(C_1,C_2,\ldots,C_N\) の値が全て同じでないならば答えは Yes です。より詳細には、 \(C_i \neq C_j\) となる添字の組 \((i,j)\) を一つ取った際に以下のように構成することができます。
\(C_i < C_j\) なら \(X_i=-(A_j+B_j),\ X_j=A_i+B_i\) とし、これら以外の値は \(0\) にする。
\(C_i > C_j\) なら \(X_i=A_j+B_j,\ X_j=-(A_i+B_i)\) とし、これら以外の値は \(0\) にする。
$C_i < C_j$ の場合を考えます。 $\displaystyle \sum_{k=1}^N A_kX_k = A_iX_i+A_jX_j=-A_i(A_j+B_j)+A_j(A_i+B_i)=A_jB_i-A_iB_j=B_iB_j\left(C_j-C_i \right)>0,$ $\displaystyle \sum_{k=1}^N B_kX_k = B_iX_i+B_jX_j=-B_i(A_j+B_j)+B_j(A_i+B_i)=A_iB_j-A_jB_i=B_iB_j\left(C_i-C_j \right)<0$ より従います。 $C_i > C_j$ の場合も同様に示すことができます。証明
以上を適切に実装することでこの問題に正答することができます。計算量は各テストケース毎に \(O(N)\) です。
for _ in range(int(input())):
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
k = -1
for i in range(1, n):
if a[i] * b[0] != b[i] * a[0]:
k = i
break
if k == -1:
print("No")
continue
x = [0] * n
x[0] = a[i] + b[i]
x[i] = a[0] + b[0]
if a[0] * b[i] > a[i] * b[0]:
x[i] *= -1
else:
x[0] *= -1
print("Yes")
print(*x)
posted:
last update:
