签到1题解

本题做法:利用双指针可以求出连续1的区间[i,j)j-i表示区间长度,由等差数列求和公式得这段区间对答案的贡献值为s=1+2+...+(j-i)=\frac{(1+j-i)*(j-i)}{2},将每一段的贡献值累加即可,时间复杂度为O(n)

AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
	long long sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		if(a[i]==1){
			int j=i;
			while(j<=n&&a[j]==1)j++;
			sum+=(1+j-i)*(j-i)/2;
			i=j-1;	
		}
		
	} 
	cout<<sum<<endl;
	return 0;
}
var code = "99ba8797-35bf-4cc5-a10d-d8d76ec43ea5"

posted @ 2025-03-09 23:29  yxl1  阅读(0)  评论(0)    收藏  举报  来源