Codeforces Round #674 (Div. 3) D. Non-zero Segments

题目

  • 题意

给你一个数组,不包含 0 0 0 但是要求你插入最少的数(随意大小),使得没有任何一个子数组的和为 0 0 0

  • 思路

肯定要想到前缀和;自己笨死了,不知道以后咋处理了。也想到要用 m a p map map哈希了,但是忘了消除前缀影响了——意思就是一旦你找到了 p r e [ l ] = = p r e [ r ] pre[l]==pre[r] pre[l]==pre[r] r之前的所有前缀都会失效,因为你可以选择在 l ∼ r l \sim r lr 这一段区间,你可以搞掉他,使得他的区间和不为 0 0 0,从而对以后的处理没有影响了。如果不删除影响的话,就会出现大区间包含小区间的情况被重复计算,看样例3

9
-1 1 -1 1 -1 1 1 -1 -1

  • 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	int n; cin >> n;
	vector <ll> v(n);
	for(ll &x : v) cin >> x;
	int ans = 0; ll cur = 0;
	map <ll, int> pre;
	pre[0] = 1;
	for(int i = 0; i < n; i ++) {
		cur += v[i];
		if(pre[cur]) {
			ans ++;
			pre.clear();//清楚前缀影响
			cur = v[i];//从这里以后开始重新考虑
			pre[0] = 1;
		}
		pre[cur] = 1;
	}
	cout << ans;
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的码泰君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值