分析

考虑答案的单调性,我们先钦定一个值为最小值或最大值。那么如果 是一个满足的区间,那么 也一定是一个合法区间。对于每一个数都求出它的分界点。那么 。这个直接上单调队列。时间复杂度为

代码

#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;
}