是做法不对吗,二分一个 b−a。
#include<iostream>
#include<cstring>
using namespace std;
int n,m,a[1000005],q[1000005],ansl,ansr;
bool t[2005];
bool check(int x){
int l=1,r=0;
for(int i=1;i<=n;i++){
while(l<=r&&i-q[l]>x)l++;
memset(t,0,sizeof(t));
q[++r]=i;
for(int i=l;i<=r;i++){
t[a[q[i]]]=1;
}
bool flag=0;
for(int i=1;i<=m;i++){
if(!t[i]){
flag=1;
break;
}
}
//cout<<flag<<"\n";
if(flag==0){
ansl=q[l],ansr=q[r];
return 1;
}
}
//cout<<x<<"\n";
return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=0,r=n;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
r=mid-1;
}else{
l=mid+1;
}
}
cout<<ansl<<" "<<ansr;
return 0;
}