问的是一个数字序列中,有多少个第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; }