CF1582 D. Vupsen, Pupsen and 0(构造)
目录
Description
有 \(n\) 个数,构造一个 \(b\) 数组使得 \(\sum a_i*b_i=0\)
State
\(1<=n<=10^5\)
\(-10^4<=a_i<=10^4\)
Input
3
2
5 5
5
5 -2 10 -9 4
7
1 2 3 4 5 6 7
Output
1 -1
-1 5 1 -1 -1
-10 2 2 -3 5 -1 -1
Solution
如果 \(n\) 为偶数,那么两个一组就可以消去
否则,将前三个分成一组 \(a[1]*a[3]+a[2]*a[3]-a[3]*(a[1]+a[2])\)
但是 \(a[1]+a[2]\) 可能为 \(0\),但是三个数中一定有两个数不互为相反数,分类讨论即可
Code
const int N = 2e5 + 5;
int n, m, k, _;
int a[N];
int ans[N];
signed main()
{
// IOS;
rush(){
sd(n);
rep(i, 1, n) sd(a[i]);
m = n;
if(n & 1){
m = n - 3;
if(a[m + 1] + a[m + 2] == 0 && a[m + 1] == a[m + 3]){
ans[m + 1] = a[m + 1];
ans[m + 2] = (a[m + 1] + a[m + 3]);
ans[m + 3] = a[m + 3];
}
else if(a[m + 1] + a[m + 2] == 0 && a[m + 2] == a[m + 3]){
ans[m + 1] = (a[m + 2] + a[m + 3]);
ans[m + 2] = a[m + 2];
ans[m + 3] = a[m + 3];
}
else if(a[m + 1] + a[m + 2] == 0){
ans[m + 1] = a[m + 2];
ans[m + 2] = - (a[m + 1] + a[m + 3]);
ans[m + 3] = a[m + 2];
}
else{
ans[m + 1] = a[m + 3];
ans[m + 2] = a[m + 3];
ans[m + 3] = - (a[m + 1] + a[m + 2]);
}
}
for(int i = 1; i <= m; i += 2){
ans[i] = a[i + 1];
ans[i + 1] = - a[i];
}
for(int i = 1; i <= n; i ++) printf("%d ", ans[i]);
puts("");
}
// PAUSE;
return 0;
}