50分,玄关求调
查看原帖
50分,玄关求调
957917
ljkgs6789楼主2024/9/7 22:07
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,u,v,ans,maxx,sec,sb[100010],lll;
struct node{
	ll x,t,id;
}ed[100010],edge[100010];
bool cmp(node l,node r){
	return l.t<r.t;
}
ll check(ll a){
	ll l=0,r=n+1;
	while(l!=r-1){
		ll mid=(l+r)>>1;
		if(ed[mid].t<a){
			l=mid;
		}else{
			r=mid;
		}
	}
	return l;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>ed[i].x>>ed[i].t;
		ed[i].id=i;
	}
	sort(ed+1,ed+1+n,cmp);
	for(ll i=1;i<=n;i++){
		sb[ed[i].id]=i;
	}
	maxx=-1;
	for(ll i=1;i<n;i++){
		if(maxx<=(abs(ed[i].x-ed[i+1].x))/(abs(ed[i].t-ed[i+1].t))){
			lll=i;
			sec=maxx;
			maxx=(abs(ed[i].x-ed[i+1].x))/(abs(ed[i].t-ed[i+1].t));
		}
	}
	ll nb=sec;
	for(ll i=1;i<=m;i++){
		cin>>u>>v;
		sec=nb;
		ll a=abs(ed[sb[u]-1].x-ed[sb[u]+1].x);
		ll b=abs(ed[sb[u]-1].t-ed[sb[u]+1].t);
		if(b!=0)sec=max(sec,a/b);
		ll l=check(v),r=l+1;
		a=abs(ed[l].x-ed[sb[u]].x);
		b=abs(ed[l].t-v);
		if(b!=0)sec=max(sec,a/b);
		a=abs(ed[r].x-ed[sb[u]].x);
		b=abs(ed[r].t-v);
		if(b!=0)sec=max(sec,a/b);
		a=abs(ed[sb[u]-1].x-ed[sb[u]].x);
		b=abs(ed[sb[u]-1].t-ed[sb[u]].t);
		if(b!=0&&maxx==a/b){
			cout<<sec<<endl;
			continue;
		}
		a=abs(ed[sb[u]+1].x-ed[sb[u]].x);
		b=abs(ed[sb[u]+1].t-ed[sb[u]].t);
		if(b!=0&&maxx==a/b){
			cout<<sec<<endl;
			continue;
		}
		cout<<max(sec,maxx)<<endl;
	}
	return 0;
}
2024/9/7 22:07
加载中...