二分代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
long long w,t,id;
}a[210000];
long long l[210000],r[210000],n,m,h[210000];
bool cmp(node x,node y){
return x.t<y.t;
}
int main(){
long long i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++){
cin>>a[i].w>>a[i].t;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(i=1;i<=n;i++) h[a[i].id]=i;
for(i=2;i<=n;i++){
l[i]=max(l[i-1],(abs(a[i].w-a[i-1].w))/(abs(a[i].t-a[i-1].t)));
}
for(i=n-1;i>=1;i--){
r[i]=max(r[i+1],(abs(a[i].w-a[i+1].w))/(abs(a[i].t-a[i+1].t)));
}
long u,v;
while(m--){
cin>>u>>v;
long long ans=0,p=a[h[u]].w;
ans=max(l[h[u]-1],r[h[u]+1]);
long long r1,l1;
r1=n; l1=1;
while(l1<r1){
long long mid=(l1+r1)/2;
if(a[mid].t<v) l1=mid+1;
else r1=mid;
}
ans=max(ans,max(abs(a[r1-1].w-p)/abs(a[r1-1].t-v),abs(a[r1].w-p)/abs(a[r1].t-v)));
cout<<ans<<endl;
}
}
但是把二分改为枚举却能的50pts,其他点TLE。 枚举代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
long long w,t,id;
}a[210000];
long long l[210000],r[210000],n,m,h[210000];
bool cmp(node x,node y){
return x.t<y.t;
}
int main(){
long long i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++){
cin>>a[i].w>>a[i].t;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(i=1;i<=n;i++) h[a[i].id]=i;
for(i=2;i<=n;i++){
l[i]=max(l[i-1],(abs(a[i].w-a[i-1].w))/(abs(a[i].t-a[i-1].t)));
}
for(i=n-1;i>=1;i--){
r[i]=max(r[i+1],(abs(a[i].w-a[i+1].w))/(abs(a[i].t-a[i+1].t)));
}
long u,v;
while(m--){
cin>>u>>v;
long long ans=0,p=a[h[u]].w;
ans=max(l[h[u]-1],r[h[u]+1]);
long long r;
for(i=1;i<=n;i++){ //修改部分
if(a[i-1].t<v&&a[i].t>v){
r=i;
break;
}
}
ans=max(ans,max((abs(a[r-1].w-p))/(abs(a[r-1].t-v)),(abs(a[r].w-p))/(abs(a[r].t-v))));
cout<<ans<<endl;
}
}