题目描述
《无限的斯特拉托斯》又称之为名作之壁,其销量一直被圈内人士津津乐道。给你n个数字,第i个数字a[i]表示名作之壁第ii天的销量。若某段区间[l,r][l,r]中最大值和最小值之差大于kk,则称该区间为畅销区间。请问一共有多少个区间为畅销区间?
思路:两个单调队列,记录最大值最小值,然后比较记录答案。
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,k,cnt1=0,cnt2=0,f1=0,f2=0;
long long a[10000007],q1[10000007],q2[10000007],b,c;
const int mod=1e9;
int main()
{
scanf("%d%d",&n,&k);
scanf("%lld%lld%lld",&a[0],&b,&c);
int l=1,i;
//q1[cnt1++]=a[0];//da
//q2[cnt2++]=a[0];//xiao
long long ans=0;
for(i=1;i<=n;i++){
a[i]=(a[i-1]*b+c)%mod;
//printf("%lld\n",a[i]);
while(cnt1>f1&&q1[cnt1-1]<a[i])cnt1--;
q1[cnt1++]=a[i];
while(cnt2>f2&&q2[cnt2-1]>a[i])cnt2--;
q2[cnt2++]=a[i];
//printf("%d %d %lld %lld\n",f1,f2,q1[f1],q2[f2]);
while(q1[f1]-q2[f2]>k&&f1<cnt1&&f2<cnt2){
ans+=n-i+1;
if(q1[f1]==a[l])f1++;
if(q2[f2]==a[l])f2++;
l++;
}
//printf("%d\n",ans);
}
printf("%lld\n",ans);
return 0;
}



京公网安备 11010502036488号