求HACK
查看原帖
求HACK
558930
FloatingIsland68楼主2021/10/8 20:57

萌新只有样例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;
}
2021/10/8 20:57
加载中...