二分答案+哈希(奇怪的思路)
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[1000002],MAX=-1,MIN=0x7f7f7f7f,l,r,mid,ans=0x7f7f7f7f;
unordered_map<int,int> tp;
bool check(){
cout<<mid<<"mid\n";
for(int i=MIN;i<=MAX;i++){
if(tp[i]>=m) return true;
else{
int cnt=m;
cnt-=tp[i];
int flj=0,flk=0;
cout<<"kt "<<i<<endl;
for(int j=i+1,k=i-1;(j-k)<=mid;){
cout<<j<<' '<<k<<" c "<<cnt<<endl;
if(cnt<=0) return true;
if(j<=n&&flj==0){
if(tp[j]!=0) cnt-=tp[j];
j++;
}
else if(flj==0){
flj=1;
j--;
}
if((j-k)==mid){
if(cnt<=0) return true;
else if(flk==0){
cout<<j<<" "<<k<<" "<<cnt<<" "<<tp[j]<<" ff "<<tp[k]<<endl;
cnt+=tp[j];
cout<<"cnttttttt "<<cnt<<endl;
cnt-=tp[k];
if(cnt<=0){
cout<<111111<<endl;
return true;
}
else break;
}
}
if(k>=1&&flk==0){
if(tp[k]!=0) cnt-=tp[k];
k--;
}
else if(flk==0){
flk=1;
k++;
}
cout<<j<<' '<<k<<" "<<cnt<<endl;
}
}
}
return false;
}
signed main(){
//freopen("ring3.in","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
MAX=max(MAX,a[i]);
MIN=min(MIN,a[i]);
tp[a[i]]++;
}
l=0,r=MAX-MIN;
while(l<r){
mid=(l+r)/2;
if(check()){
ans=min(ans,mid);
r--;
}
else l++;
}
cout<<ans;
return 0;
}