救!!!卡两个点WA
查看原帖
救!!!卡两个点WA
1279718
phigros_player楼主2024/5/19 12:11
#include <bits/stdc++.h>
using namespace std;
struct K {
	int x;
	long long id;
};
bool cmp(K x,K y) {
	return x.id<y.id;
}
bool cmp_x(K x,K y) {
	return x.x<y.x;
}
int n,m=1,k;
K a[50005];
int b[50005];
int ans=(1<<30);
int main() {
	scanf("%d",&n);
	for(int i=1; i<=n; i++)scanf("%d%lld",&a[i].x,&a[i].id);//输入
	sort(a+1,a+n+1,cmp);//预处理离散化
	a[1].id=1;
	int cnt=1;
	for(int i=2; i<=n; i++) {
		if(a[i-1].id!=a[i].id)cnt++,m++;
		a[i].id=cnt;
	}
//	for(int i=1; i<=n; i++) {
//		cout<<a[i].id<<" ";
//	}
	sort(a+1,a+n+1,cmp_x);//预处理双指针搜索
	int i=1,j=1;
	while(i<=j&&j<=n) {
		b[a[j].id]++;
		if(b[a[j].id]==1)k++;//累加种类
		if(k<m)j++;
		else {
			while(k==m) {
				b[a[i].id]--;
				if(b[a[i].id]==0)k--;//推i
				i++;
			}
			ans=min(a[j].x-a[i-1].x,ans);//更新ans
//			cout<<a[i].x<<" "<<a[j].x<<endl;
			j++;//不要忘记继续循环
		}
	}
	cout<<ans;
	return 0;
}


WA点:#3,#7

2024/5/19 12:11
加载中...