双指针 | 前缀和

这是一道双指针入门题

双指针分为同向和反向走,此处为同向,注意先让右指针r走,这样就可以给l限制条件,然后保证在l-1~r的闭区间内,坏数不超过一个(坏数就是不能被g整除的数)然后把前n位的坏数和用前缀和记录下来。然后答案就是r-l,下面实地推导一下。

1 1 1 2 2 3 3 3 3 4 那么为了找到不超过1的区间如果10前面有4个坏数,那么我们找到前面有2个坏数的位置,那么在2之后除了第一个变3的数,之后的数都可以用,总之用l-1巧妙地判断了条件

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int a[N];
int main()
{
	int x,n,g,ans=0;
	cin>>n>>g;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		if(x%g) a[i]=1;
		a[i]+=a[i-1];
	}
//	for(int i=1;i<=n;i++)cout<<a[i];cout<<endl;
	for(int r=2,l=1;r<=n;r++)
	{
		while(l<r&&a[r]-a[l-1]>1)
		l++;
//	cout<<l<<r<<endl;
    ans+=r-l;
	}
	cout<<ans;
}

不理解可以用两行注释来输出辅助理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值