链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小ddd这一天拿到了一个序列aaa,这个序列只包含000和111,但是他认为一个区间[l,r][l,r][l,r]是孤独的,当且仅当在这个区间内Σi=lrai=1\Sigma^{r}_{i=l} a_i=1Σi=lrai=1,你不要问他为什么如此多愁善感,那是因为他没有把他女朋友拍好,他很自责,由于小ddd现在很emo,所以请你帮助他找到一共有多少个区间是孤独的吧!
注意:①我们认为两个区间[li,ri],[lj,rj][l_i,r_i],[l_j,r_j][li,ri],[lj,rj]不同,当且仅当li≠ljl_i≠l_jli=lj或者ri≠rjr_i≠r_jri=rj。
② 对于公式的解读:我们定义一个区间是孤独的,需要保证你找到的这个区间当且仅当只有一个元素是1,其他元素均要为0。
输入描述:
第一行一个整数n,1≤n≤106n,1 \leq n \leq 10^6n,1≤n≤106,代表该序列一共有多少个数字。 第二行nnn个整数,第iii个数代表序列第iii个数ai,0≤ai≤1a_i,0 \leq a_i \leq 1ai,0≤ai≤1。输出描述:
输出一个数字代表答案。示例1
输入
abcdNTR
输出
ABCDntr
思路
通过另一个数组记录下“1”所在的位置,题目要求不能有两个“1”存在。通过下标相减可得到“1”左边到前一个“1”之间零的数量,和右边到后一个“1”的零的数量。
#include<stdio.h>
long long a[1000010];
int main() {
a[0] = 0;
int n, k = 1,b;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &b);
if (b == 1)
a[k++] = i;//记录下标
}
a[k] = n + 1;
long long sum = 0;
for (int i = 1; i < k; i++) {
sum += (a[i] - a[i - 1]) * (a[i + 1] - a[i]);//下标差相乘就是区间个数
}
printf("%lld", sum);
return 0;
}