数组段数 数组遍历 前缀和

把不同的元素之间加上隔板,给定区间就是求区间里一共有多少个隔板:

(先看代码)给的序列为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值