• 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

     

  • 相关阅读:
    818专业课【考经】—《信号系统》之章节概要:第八章 傅里叶变换的应用
    图解分布式事务实现原理(一)
    为什么百度百科有词条,而维基百科无法创建?
    异步性能不如同步?通过压测讨论应该如何设置线程数
    【CNN-FPGA开源项目解析】卷积层02--floatAdd16模块
    Excel文档名称批量翻译的高效方法
    [报错解决]源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
    Netty原理与基础
    探究——C# .net 代码混淆/加壳
    PGRouting导航规划-AStar算法
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127904042