
这是一道双指针入门题
双指针分为同向和反向走,此处为同向,注意先让右指针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;
}
不理解可以用两行注释来输出辅助理解
1651

被折叠的 条评论
为什么被折叠?



