思路:因为是定长区间,因此我们可以利用滑动窗口维护定长区间的众数的数量
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 998244353;
const int N = 2e5 + 10;
ll a[N];
ll b[N];
int main()
{
int t;
cin >> t;
while(t --){
ll n, k, q;
cin >> n >> k >> q;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
a[i] -= i;
}
map<ll, ll>ma, cnt;
for(int i = 1; i <= n; i ++)
{
if(cnt.count(ma[a[i]]))
{
cnt[ma[a[i]]] -= 1;
if(!cnt[ma[a[i]]]) cnt.erase(ma[a[i]]);
}
ma[a[i]] += 1;
cnt[ma[a[i]]] += 1;
if(i < k) continue;
b[i - k + 1] = cnt.rbegin() ->first;
cnt[ma[a[i - k + 1]]] -= 1;
if(!cnt[ma[a[i - k + 1]]]) cnt.erase(ma[a[i - k + 1]]);
ma[a[i - k + 1]] -= 1;
if(ma[a[i - k + 1]]) cnt[ma[a[i - k + 1]]] += 1;
}
while(q --){
ll l, r;
cin >> l >> r;
cout << k - b[l] << endl;
}
}
return 0;
}