分析
考虑答案的单调性,我们先钦定一个值为最小值或最大值。那么如果 是一个满足的区间,那么
也一定是一个合法区间。对于每一个数都求出它的分界点。那么
。这个直接上单调队列。时间复杂度为
。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 100,P = 1e9;
int n,a[N],k,b,c;
int q[N],ans[N],l,r,len;
int main()
{
cin >> n >> k >> a[0] >> b >> c;
for(int i = 1;i <= n;i++) a[i] = (1LL * a[i-1] * b + c) % P;
l = 1;r = 0;len = 0;
for(int i = 1;i <= n;i++) {
while(l <= r && a[q[l]] > a[i] + k) len = q[l],l++;
ans[i] = max(ans[i],len);
while(l <= r && a[q[r]] <= a[i]) r--;
q[++r] = i;
}
l = 1;r = 0;len = 0;
for(int i = 1;i <= n;i++) {
while(l <= r && a[q[l]] < a[i] - k) len = q[l],l++;
ans[i] = max(ans[i],len);
while(l <= r && a[q[r]] >= a[i]) r--;
q[++r] = i;
}
long long Ans = 0;
for(int i = 1;i <= n;i++) Ans += ans[i];
cout << Ans << endl;
return 0;
}
京公网安备 11010502036488号