首页 > 其他 > 详细

【题解】CF1426D Non-zero Segments

时间:2020-10-02 00:15:24      阅读:60      评论:0      收藏:0      [点我收藏+]

题目戳我

\(\text{Solution:}\)

\([l,r]\)子段和是\(0,\)\(sum[r]=sum[l-1].\)

于是我们可以考虑维护当前哪一个前缀和出现过。对于区间\([l,r]\)若其子段和为\(0\)则在\(r-1\)的地方插入一个\(+\infty\)即可。

初始化要把\(0\)赋值为出现过。

#include<bits/stdc++.h>
using namespace std;
int n,a[500010];
map<long long,bool>mp;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
	mp[0]=true;
	long long s=0;
	int ans=0;
	for(int i=1;i<=n;++i){
		s+=a[i];
		if(mp[s]){
			ans++;
			mp.clear();
			mp[0]=true;
			s=a[i];
		}
		mp[s]=true;
	}
	cout<<ans<<endl;
	return 0;
}
```cpp

【题解】CF1426D Non-zero Segments

原文:https://www.cnblogs.com/h-lka/p/13759321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!