NC209881. 名作之壁
描述
《无限的斯特拉托斯》又称之为名作之壁,其销量一直被圈内人士津津乐道。给你个数字,第个数字表示名作之壁第天的销量。若某段区间中最大值和最小值之差大于,则称该区间为畅销区间。请问一共有多少个区间为畅销区间?
输入描述
第一行两个正整数,,其中,。
接下来一行三个正整数,,,按照的规则生成第天到第天的销量,不算入区间计算,其中。
输出描述
输出畅销区间的个数。
示例1
输入:
4 1 1 1 1
输出:
3
C++(clang++11) 解法, 执行用时: 289ms, 内存消耗: 157048K, 提交时间: 2021-01-18 11:19:14
#include<bits/stdc++.h> using namespace std; const int N=1e7+10; const int mod=1e9 ; #define int long long int q1[N],q2[N],a[N],hh,tt=-1,hh1,tt1=-1; signed main() { int n,k; int a0,b,c,L=1; cin>>n>>k>>a[0]>>b>>c; int ans=0; for(int i=1;i<=n;i++) { a[i]=(a[i-1]*b+c)%mod; while(hh<=tt && a[i]>=a[q1[tt]]) --tt;//单调递减队列 while(hh1<=tt1 && a[i]<=a[q2[tt1]]) --tt1;//单调递增队列 q1[++tt]=i,q2[++tt1]=i; while(a[q1[hh]]-a[q2[hh1]]>k) { ans+=n-i+1; L++; if(q1[hh]<L) hh++; if(q2[hh1]<L) hh1++; } } cout<< ans << endl; return 0; }
C++14(g++5.4) 解法, 执行用时: 266ms, 内存消耗: 78656K, 提交时间: 2020-09-10 09:46:11
#include<bits/stdc++.h> #define ll long long using namespace std; const int nx=1e7+5; const ll mod=1e9; int n,k,a[nx],mi[nx],mx[nx],b,c; int main(){ cin>>n>>k>>a[0]>>b>>c; int f=1,r=0,nf=1,nr=0; ll ans=0; for(int i=1,l=1;i<=n;++i){ a[i]=(1ll*a[i-1]*b+c)%mod; while(f<=r&&a[i]>=a[mx[r]])--r; mx[++r]=i; while(nf<=nr&&a[i]<=a[mi[nr]])--nr; mi[++nr]=i; while(a[mx[f]]-a[mi[nf]]>k){ ans+=n-i+1,++l; if(mx[f]<l)++f; if(mi[nf]<l)++nf; } } cout<<ans; }