题目连接:https://codeforces.com/contest/1247/problem/B2
题解:双指针,,一个头,一个尾,头部进入,尾部退出,一开始先记录1到k,并记录每个数字出现的次数,然后在头进尾出,依次判断。
#include<bits/stdc++.h> using namespace std; const int N=2E5+7; map<int ,int >mp; int arr[N]; void solve(){ mp.clear(); int n,m,k; cin>>n>>m>>k; for(int i=1;i<=n;i++) scanf("%d",&arr[i]); int ans=0; for(int i=1;i<=k;i++){ if(mp[arr[i]]==0) ans++; mp[arr[i]]++; } int sum=ans; for(int j=k+1,i=1;j<=n;j++,i++){ if(mp[arr[i]]==1) ans--; mp[arr[i]]--; if(mp[arr[j]]==0) ans++; mp[arr[j]]++; sum=min(ans,sum); } cout<<sum<<endl; } int main(){ int t; cin>>t; while(t--) solve(); return 0; }