#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