• D. Non-zero Segments(前缀和)


    Problem - 1426D - Codeforces

    题意:

    科利亚得到一个整数数组a1,a2,...,an。这个数组既可以包含正整数也可以包含负整数,但是Kolya不喜欢0,所以这个数组不包含任何零。

    Kolya不喜欢他的数组中某些子段的总和为0,子段是数组中一些连续的元素段。

    为了达到这个目标,你可以在数组的任何一对相邻元素之间插入任何整数(整数可以是任何:正数、负数、0,任何绝对值,甚至是巨大到无法用大多数标准编程语言表示的整数)。

    你的任务是找出你必须插入Kolya数组中的最小整数,以使产生的数组不包含任何和为0的子段。

    输入
    输入的第一行包含一个整数n(2≤n≤200000)--Kolya数组中的元素数。

    输入的第二行包含n个整数a1,a2,...,an(-109≤ai≤109,ai≠0)--Kolya数组的描述。

    输出
    打印你必须插入Kolya数组中的最小整数,使产生的数组不包含任何总和为0的子段。

    例子
    InputCopy
    4
    1 -5 3 2
    outputCopy
    1
    输入复制
    5
    4 -2 3 -9 2
    输出拷贝
    0
    输入复制
    9
    -1 1 -1 1 -1 1 1 -1 -1
    输出拷贝
    6
    输入复制
    8
    16 -5 -11 -15 10 5 4 -4
    输出拷贝
    3
    注意
    考虑第一个例子。只有一个总和为0的子段,它开始于第二个元素,结束于第四个元素。插入一个元素就够了,这样数组就不会包含任何总和等于0的子段了。例如,可以在数组的第二和第三元素之间插入整数1。

    在第二个例子中没有总和为0的子段,所以你不需要做什么。

    题解:

    我们每次记录前缀和出现过的情况,让插入一个数,然后插入的数++,map清空,前缀和从当前开始,

    关键是为什么插入的数要++,我看很多题解并没有说明这个问题,或是理解错了

    大个比方现在我遇到一个数x加上后,前缀出现过,插入了一个1,然后我们把map清空,让前缀=x,但是后面又遇到一个数加上后前缀和等于x,如果我么还插入1,就会出现一个问题,

    1 9........ 1 9

    前面的插入的两个1,1区间和会为0,

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<map>
    4. #include<queue>
    5. #include<vector>
    6. #include<cstring>
    7. using namespace std;
    8. long long a[300050];
    9. void solve()
    10. {
    11. int n;
    12. cin >> n;
    13. map<long long,int> f;
    14. long long s = 0;
    15. f[0] = 1;
    16. int ans = 0;
    17. for(int i = 1;i <= n;i++)
    18. {
    19. int k;
    20. cin >> k;
    21. s+= k;
    22. if(f[s] == 1)
    23. {
    24. ans++;
    25. s = k;
    26. f.clear();
    27. f[0] = 1;
    28. }
    29. f[s] = 1;
    30. }
    31. cout<<ans;
    32. }
    33. int main()
    34. {
    35. int t = 1;
    36. // cin >> t;
    37. while(t--)
    38. {
    39. solve();
    40. }
    41. }
    42. //
    43. //abcdef
    44. //babcdef
    45. //babcdefedcba

     

  • 相关阅读:
    Python Faker库造伪数据
    扩散模型Diffusion轻松入门
    移动应用安全需求分析与安全保护工程
    【pycharm】控制台报错:终端无法加载文件\venv\Scripts\activate.ps1
    进阶JAVA篇-如何理解作为参数使用的匿名内部类与 Arrays 类的常用API(九)
    【剑指offer|图解|双指针】移除元素 + 合并两个有序数组
    LFS学习系列4 — I.介绍
    java计算机毕业设计ssm气象百事通系统-天气预报系统
    Linux常用命令
    【基础算法Ⅰ】算法入门篇
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127904042