大样例3没过,但是5e5太大了,调不出来,求一个小一点的hack数据或者帮蒟蒻调一调。谢谢!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define int long long
inline int read(){
register int x=0,f=0,ch=getchar();
while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
while('0'<=ch&&ch<='9')x=x*10+(ch^'0'),ch=getchar();
return f?-x:x;
}
const int MAX=6e6+5;
int n,m;
struct E{int op,v,id;}a[MAX];
inline int cmp(const E & x,const E & y){
return x.v < y.v;
}
int vis[MAX],pre[MAX],suf[MAX];
int buc[MAX],pas[MAX];
signed main(){
// freopen("in.in","r",stdin);
memset(pas,0x3f,sizeof(pas));
n=read(),m=read();
for(register int i=1;i<=n;++i)a[i].op=0,a[i].v=read(),a[i].id=i;
for(register int i=n+1;i<=n+n;++i)a[i].op=1,a[i].v=read(),a[i].id=i-n;
sort(a+1,a+1+n+n,cmp);
for(register int i=1;i<=n+n;++i)pre[i] = pre[i-1] + (a[i].op == 1);
for(register int i=n+n;i;--i){
suf[i] = suf[i+1] + (a[i].op == 1);
pas[a[i].id] = min(pas[a[i].id],i);
// printf("%d : %d %d %d\n",i,a[i].v,a[i].id,a[i].op);
}
// puts("");
int ans=0x3f3f3f3f3f3f3f3f,high=n+n,L=0;
while (L<n+n && !buc[a[L+1].id])++L,buc[a[L].id]=1;
memset(buc,0,sizeof(buc));
for(register int i=n+n;i>=1;--i){
int l=1,r=min(L+1,high),pos=-1;
while (l<=r){
int mid=l+r>>1;
if(pre[mid-1] + suf[i+1] <=m) l=mid+1, pos=mid;
else r=mid-1;
}
if(pos != -1)ans = min (ans,a[i].v - a[pos].v);
if(buc[a[i].id])break;
++buc[a[i].id];
high=min(high,pas[a[i].id]);
high=min(high,i-1);
}
printf("%lld\n",ans);
return 0;
}