Educational Codeforces Round 93 (Rated for Div. 2) K. Lonely Numbers

Problem - C - Codeforces

翻译:

给定一个数组𝑎1,𝑎2,…,𝑎𝑛,由0到9的整数组成。一子数组𝑎𝑙,𝑎𝑙+ 1,𝑎𝑙+ 2,…,𝑎𝑟−1,𝑎𝑟很好如果这个子数组的元素之和等于这个子数组的长度(∑𝑖=𝑙𝑟𝑎𝑖=𝑟−𝑙+ 1)。

例如,如果𝑎=(1 2 0),然后有3好子阵:𝑎1…1 =[1],𝑎2…3 =(2,0)和𝑎1…3 =(1 2 0)。

计算数组𝑎的好子数组的数量。

输入
第一行包含一个整数𝑡(1≤𝑡≤1000)——测试用例的数量。

每个测试用例的第一行包含一个整数𝑛(1≤𝑛≤105)——数组𝑎的长度。

每个测试用例的第二行包含一个由𝑛十进制数字组成的字符串,其中𝑖-th数字等于𝑎𝑖的值。

可以保证所有测试用例中𝑛的总和不超过105。

输出
对于每个测试用例,打印一个整数——数组𝑎的好子数组的数量。

例子
inputCopy
3.
3.
120
5
11011
6
600005
outputCopy
3.
6
1
请注意
语句中考虑第一个测试用例。

在第二个测试用例,有6好子阵:𝑎1…1,𝑎2…2,𝑎1…2,𝑎4…4,𝑎5…5和𝑎4…5。

在第三个测试用例中,只有一个好的子数组:𝑎2…

思路:

区间和等于区间长度,我们将其转化成为前缀和,那就是s[r]-s[l]=r-l+1,将其每次减1,那么就是s[r]-r=s[l]-l,所以就是相同的前缀然后其中取两个就好了。

代码:

/*Looking! The blitz loop this planet to search way
 
 Only my RAILGUN can shoot it 今すぐ
 
 身体中を  光の速さで
 
 駆け巡った確かな予感
 
 掴め! 望むものなら残さず
 
 輝ける自分らしさで
 
 信じてるよ  あの日の誓いを
 
 この瞳に光る涙それさえも  強さになるから
 
 */
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
#include<stack>
using namespace::std;
typedef long long  ll;
int n,t;
inline __int128 read(){
    __int128 x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
inline void print(__int128 x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}

int a[100005];
ll s[100005];
char ss;
void wanyurukong(){
    cin>>n;
    ll an=0;
    map<ll,ll>q;
    for (int i=1; i<=n; i++) {
        cin>>ss;
        a[i]=ss-'0';
    }
    q[0]=1;
    for (int i =1; i<=n; i++) {
        s[i]=s[i-1]+a[i]-1;
        q[s[i]]++;
    }

    for(auto x:q){
        an+=x.second*(x.second-1)/2;
    }
    printf("%lld\n",an);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
    cin>>t;
    while (t--) {
        wanyurukong();
    }
    //wanyurukong
    return 0;
}
 

 

"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值