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;
}
posted @ 2021-11-01 10:36  Bcoi  阅读(64)  评论(0)    收藏  举报