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