萌新只有样例3没过,但它太大了,不好调试,求小规模hack数据 QAQ
用双指针写的
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6;
int n,m;
struct Node{
int x,id,up;
bool operator < (const Node& node) const
{
return x < node.x;
}
}a[N + N + 5];
int cnt[N + 5];
inline int read()
{
int res = 0;
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while ('0' <= ch && ch <= '9')
{
res = res * 10 + ch - '0';
ch = getchar();
}
return res;
}
int main()
{
// freopen("card3.in","r",stdin);
// freopen("test.out","w",stdout);
n = read(),m = read();
for (int i = 1;i <= n;i++)
{
a[i].x = read();
a[i].id = i,a[i].up = 1;
}
for (int i = 1;i <= n;i++)
{
a[i + n].x = read();
a[i + n].id = i,a[i + n].up = 0;
}
sort(a + 1,a + n + n + 1);
int l = 1,sum = 0,down = 0,ans = 2e9;
for (int i = 1;i <= n * 2;i++)
{
cnt[a[i].id]++;
if (cnt[a[i].id] == 1) sum++;
if (a[i].up == 0)
{
if (cnt[a[i].id] == 1) down++;
}
else
{
if (cnt[a[i].id] == 2) down--;
}
while (cnt[a[l].id] > 1)
{
if (sum == n && down <= m) ans = min(ans,a[i].x - a[l].x);
cnt[a[l].id]--;
if (a[l].up == 1)
{
down++;
}
l++;
}
if (sum == n && down <= m) ans = min(ans,a[i].x - a[l].x);
}
printf("%d\n",ans);
return 0;
}