CF1801B Buying gifts 题解
题目大意
给定
题解
首先考虑时间复杂度,
首先将
因为是多组数据,所以每次操作完之后都要清空
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
const int M=500005;
int n,maxv[M],ans;
set<int> s;
struct node{
int a,b;
}p[M];
bool cmp(node x,node y){
return x.a<y.a;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d%d",&p[i].a,&p[i].b);
sort(p+1,p+1+n,cmp);
maxv[n+1]=-1;//初始化为-1即可
for(int i=n;i>=1;--i)
maxv[i]=max(maxv[i+1],p[i].b);//取b[i]到b[n]中的最大值
s.clear();
ans=abs(p[1].a-maxv[2]);
s.insert(p[1].b);
for(int i=2;i<=n;++i){
int A=p[i].a,B=maxv[i+1],C=-1,D=-1;
if(i<n) ans=min(ans,abs(A-B));
set<int>::iterator it=s.lower_bound(A);//寻找s中第一个不小于A的值
if(it!=s.end()) C=*it;
if(it!=s.begin()) D=*(--it);
if(C>B) ans=min(ans,abs(A-C));
if(D>B) ans=min(ans,abs(A-D));
s.insert(p[i].b);
}
printf("%d\n",ans);
s.clear();//一定要清空
memset(maxv,0,sizeof(maxv));
}
return 0;
}