把不同的元素之间加上隔板,给定区间就是求区间里一共有多少个隔板:
(先看代码)给的序列为2 2 3 1 3 3,上面(s[i]=s[i-1]+X,X根据题而定)我们视两个不同的数之间有一个间隙,我们发现所求的结果恰好就是间隙数(X)+1,在上述代码中我定义全局cnt[i]为前缀和数组来记录1~i个间隙数之和,即对应是0 0 1 2 3 3,那么结果就是cnt[r]-cnt[l]+1.
//这个题实打实用到的是前缀和思想
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N],cnt[N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
if(a[i]!=a[i-1])
{
cnt[i]=cnt[i-1]+1;
}
else
{
cnt[i]=cnt[i-1]+0;
}
}
int l,r;
while(m--)
{
cin>>l>>r;
cout<<(cnt[r]-cnt[l]+1)<<endl;
}
return 0;
}