小d和孤独的区间

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小ddd这一天拿到了一个序列aaa,这个序列只包含000和111,但是他认为一个区间[l,r][l,r][l,r]是孤独的,当且仅当在这个区间内Σi=lrai=1\Sigma^{r}_{i=l} a_i=1Σi=lr​ai​=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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值