求助
  • 板块灌水区
  • 楼主Mx_sky
  • 当前回复20
  • 已保存回复20
  • 发布时间2023/7/1 18:51
  • 上次更新2023/11/3 11:57:26
查看原帖
求助
713205
Mx_sky楼主2023/7/1 18:51

有 n(2≤n≤100000)n(2\le n\le100000) 个排成一行的整数,从位置 11 到位置 nn,每个都在 −100-100 到 100100 之间,如果某段(个数 ≥1\ge1)的数字和是 1111 的整数倍,则称为一段 HH 型段。请统计所有 HH 型段的个数。

思路

输入用 aa 数组,aa 数组前缀和一遍,另定义一个 bb 数组。b0b_0 先定义为 11, O(n)O(n) 循环扫一遍,ans+=baians+=b_{a_i},另外 bai++b_{a_i}++。

ansans 开了 long long\verb!long long!,aia_i 前缀和后做了绝对值。

代码:

#include <bits/stdc++.h>
using namespace std;
int n,a[100003],b[50];
long long ans;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) a[i]=a[i-1]+a[i],a[i]=a[i]%11;
	for(int i=1;i<=n;i++) a[i]=abs(a[i]);
	b[0]=1;
	for(int i=1;i<=n;i++) ans+=b[a[i]],b[a[i]]++;
	cout<<ans<<endl;
    return 0;
}
2023/7/1 18:51
加载中...