• D. Vupsen, Pupsen and 0(思维 + 从小部分入手(由小推大))


    Problem - 1582D - Codeforces

    Vupsen和Pupsen被赠予一个整数数组。由于Vupsen不喜欢数字0,他把数组中所有等于0的数字都扔掉了。结果,他得到一个长度为n的数组a。

    相反,Pupsen喜欢数字0,当他看到没有0的数组时,他很不高兴。为了让Pupsen高兴,Vupsen决定想出另一个长度为n的数组b,使∑ni=1ai⋅bi=0。由于Vupsen不喜欢数字0,数组b中不能包含等于0的数字。请帮助Vupsen找到任何这样的数组b!

    输入
    第一行包含一个整数t(1≤t≤100)--测试案例的数量。接下来的2-t行包含测试用例的描述。每个测试用例的描述由两行组成。

    每个测试用例的第一行包含一个整数n(2≤n≤105)--数组的长度。

    第二行包含n个整数a1,a2,...,an(-104≤ai≤104, ai≠0)--数组a的元素。

    保证所有测试案例的n之和不超过2⋅105。

    输出
    对于每个测试案例打印n个整数b1,b2,...,bn--数组b的元素(|b1|+|b2|+...+|bn|≤109,bi≠0,∑ni=1ai⋅bi=0)。

    可以证明,答案总是存在的。

    例子
    输入复制
    3
    2
    5 5
    5
    5 -2 10 -9 4
    7
    1 2 3 4 5 6 7
    输出拷贝
    1 -1
    -1 5 1 -1 -1
    -10 2 2 -3 5 -1 -1
    注意
    在第一个测试案例中,5⋅1+5⋅(-1)=5-5=0。例如,您也可以打印3-3,因为5⋅3+5⋅(-3)=15-15=0。
    在第二个测试案例中,5⋅(-1)+(-2)⋅5+10⋅1+(-9)⋅(-1)+4⋅(-1)=5-10+10+9-4=0。

    题解:
    从整体考虑似乎有点麻烦

    那我们就从部分开始考虑

    两个数之间如何构造?

    a,b

    -b,a

    那么n为偶数的情况我们就得到了

    由此再想一想

    如果n为奇数呢?

    我们可以发现只要构造一个为3的小块,剩下的部分就为偶数了

    如何构造3个数的组呢?

    a,b,c

    (b+c) -a -a

    但是还有一点坑,可能b+c = 0

    但是不用担心三个数之间肯定有两个数相加不等于0的情况,找到构造即可

    1. #include<iostream>
    2. #include<vector>
    3. #include<queue>
    4. #include<cstring>
    5. #include<algorithm>
    6. #include<string>
    7. #include<map>
    8. using namespace std;
    9. #define int long long
    10. int a[100040];
    11. void solve()
    12. {
    13. // ios::sync_with_stdio(false);
    14. // cin.tie(0);
    15. // cout.tie(0);
    16. int n;
    17. cin >> n;
    18. for(int i = 1;i <= n;i++)
    19. cin >> a[i];
    20. if(n%2 == 0)
    21. {
    22. for(int i = 1;i <= n;i+=2)
    23. {
    24. cout<<a[i+1]<<" "<<-a[i]<<" ";
    25. }
    26. cout<<"\n";
    27. }
    28. else
    29. {
    30. if(a[2] + a[3]!=0)
    31. cout<<(a[2] + a[3])<<" "<<-a[1]<<" "<<-a[1]<<" ";
    32. else if(a[1] + a[3]!=0)
    33. cout<<-a[2]<<" "<<(a[1] + a[3])<<" "<<-a[2]<<" ";
    34. else
    35. cout<<-a[3]<<" "<<-a[3]<<" "<<(a[1] + a[2])<<" ";
    36. for(int i = 4;i <= n;i+=2)
    37. {
    38. cout<<a[i+1]<<" "<<-a[i]<<" ";
    39. }
    40. cout<<"\n";
    41. }
    42. }
    43. signed main()
    44. {
    45. int t = 1;
    46. cin >> t;
    47. while(t--)
    48. {
    49. solve();
    50. }
    51. }

  • 相关阅读:
    Swagger(2):Springfox简介
    Linux的优缺点
    Druid连接池的快速使用
    LCD和LED屏幕的工作原理总结
    MLC-LLM 支持RWKV-5推理以及对RWKV-5的一些思考
    重磅 | 死磕 Elasticsearch 8.X 方法论认知清单(2022年国庆更新版)
    升级政务版IPv6转换服务使用说明及设置示例
    设计模式使用场景实现示例及优缺点(行为型模式——策略模式)
    什么软件做可视化大屏最简单、最快?
    高级架构师_Docker_第2章_ Docker核心原理_ 第6节Docker部署微服项目
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/128149484