1495 中国好区间 尺取法

链接在这里

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

这题相当于问:区间内有不少于K的大于T的数的区间有多少.

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

#include <stdio.h>

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

int main() {
#ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
#endif
    int n, k, T, a, b, c, p;
    scanf("%d%d%d%d %d%d%d", &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;
    }
    printf("%lld\n", ans);
    return 0; 
}

猜你喜欢

转载自www.cnblogs.com/Rosebud/p/9594548.html