求助,二分RE
查看原帖
求助,二分RE
1068071
wangft楼主2024/9/8 09:25

二分代码:

#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;
	}
}
2024/9/8 09:25
加载中...