列表

详情


NC249946. 小d和孤独的区间

描述

d这一天拿到了一个序列a,这个序列只包含01,但是他认为一个区间[l,r]是孤独的,当且仅当在这个区间内\Sigma^{r}_{i=l} a_i=1,你不要问他为什么如此多愁善感,那是因为他没有把他女朋友拍好,他很自责,由于小d现在很emo,所以请你帮助他找到一共有多少个区间是孤独的吧!

注意:①我们认为两个区间[l_i,r_i],[l_j,r_j]不同,当且仅当l_i≠l_j或者r_i≠r_j
② 对于公式的解读:我们定义一个区间是孤独的,需要保证你找到的这个区间当且仅当只有一个元素是1,其他元素均要为0。

输入描述

第一行一个整数n,1 \leq n \leq 10^6,代表该序列一共有多少个数字。

第二行n个整数,第i个数代表序列第i个数a_i,0 \leq a_i \leq 1

输出描述

输出一个数字代表答案。

示例1

输入:

3
0 1 0

输出:

4

说明:

四种答案分别是[1,2],[2,2],[2,3],[1,3]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 1384ms, 内存消耗: 106268K, 提交时间: 2023-04-07 19:46:45

from collections import defaultdict

n = int(input())
a = [int(x) for x in input().split()]

mp = defaultdict()
s = 0
mp[0] = 1
res = 0
for i in range(n):
    s += a[i]
    res += mp.get(s-1,0)
    mp[s] = mp.get(s,0)+1
print(res)

pypy3 解法, 执行用时: 703ms, 内存消耗: 129664K, 提交时间: 2023-04-07 19:28:57

n = int(input())
a = list(map(int,input().split()))
from collections import Counter
has = Counter([0])
pre = ans = 0
for i in a:
    pre += i
    ans += has[pre-1]
    has[pre] += 1
print(ans)
    

C++(clang++ 11.0.1) 解法, 执行用时: 208ms, 内存消耗: 500K, 提交时间: 2023-04-11 10:00:25

#include<bits/stdc++.h>
using namespace std;
int n,x,s,l;
long long ans;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		if(x)s=i-l,l=i;
		ans+=s;
	}
	cout<<ans;
	return 0;
}

上一题