显然我们对每个限制取max即可。
然后每次维护当前有几个满足的。尺取即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; const int N=2e5+10; int n,K,R,vis[N],res,mx[N],cnt,a[N],ans=1e9; inline void add(int x){if(++vis[x]==mx[x]) res++;} inline void del(int x){if(--vis[x]==mx[x]-1) res--;} signed main(){ cin>>n>>K>>R; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1,b,q;i<=R;i++) scanf("%d %d",&b,&q),mx[b]=max(mx[b],q); for(int i=0;i<=K;i++) if(mx[i]) cnt++; int pos=1; for(int i=1;i<=n;i++){ add(a[i]); while(res==cnt) ans=min(ans,i-pos+1),del(a[pos++]); } if(ans==1e9) return puts("impossible"),0; cout<<ans; return 0; }