1495 中国好区间 尺取法

链接在这里

问的是一个数字序列中,有多少个第K大的数>=T的区间.

这题相当于问:有多少个>=K个”满足大于等于T“的元素的区间.

预处理dp[i]为前i项元素>=T的元素个数之和. 尺取维护L和R.如果dp[R]-dp[L-1]>=k,说明[L,R]这个区间是合法的,那么对于L来说, [L,E],其中E∈[R,N]都是合法的,所以答案+=n-r+1个元素. 注意用ll防止溢出

#include <bits/stdc++.h>
using namespace std;

#define ll long long 
const int maxN=1e7+5;
int dp[maxN];

int main() {
    ll n, k, T, a, b, c, p;
    cin >> n >> k >> T >> a >> b >> c >> p;
    for (int i = 1; i <= n; ++i) {
        a = (a * b + c) % p;
        dp[i] = dp[i - 1];
        if (a >= T) dp[i] += 1;
    }

    ll l = 1, r = k, ans = 0;
    while (1) {
        while (r <= n && dp[r] - dp[l - 1] < k) ++r;
        if (r > n) break;
        ans += n - r + 1;
        ++l;
    }
    cout << ans << "\n";
    return 0; 
}

 

posted @ 2018-09-05 21:20  gaawing  阅读(207)  评论(2编辑  收藏  举报