T组查询
每次n朵花 提供m种 需要编号为1-k的最短长度
n,m<=1e5 k<=m T<=10
维护区间内有k种的最短区间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
#define IO ios::sync_with_stdio(false);cin.tie(0);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
ll T;
ll n,m,k,minn=INF,a[maxn],vis[maxn],cnt;
//n朵花 m种 要编号为1-k
int main(){
IO;
cin>>T;
while(T--){
minn=INF;cnt=0;
for(int i=1;i<=100000;i++){
vis[i]=0;
}
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll l=1,r=1;
while(1){
while(r<=n && cnt<k){
vis[a[r]]++;
if(a[r]>=1 && a[r]<=k){
if(vis[a[r]]==1)
cnt++;
}
r++;
}
if(l==r)
break;
if(cnt==k){
minn=min(minn,r-l);
}
vis[a[l]]--;
if(a[l]>=1 && a[l]<=k){
if(vis[a[l]]==0)
cnt--;
}
l++;
}
if(minn==INF) //不可能有k种
cout<<-1<<endl;
else
cout<<minn<<endl;
}
return 0;
}
快速读
const double eps = 1e-6;
const double pi = acos(-1.0);
const int MAXN = 40005;
inline int read() {
int c = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
c = c * 10 + ch - '0';
ch = getchar();
}
return c * f;
}