全Wa,球跳
查看原帖
全Wa,球跳
1353330
K_J_M楼主2024/9/7 20:17
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+10;
int n,m,u,v;
struct G{
	int x,t;
}a[N];
int b[N],c[N],d[N];
bool cmp(G x,G y){
	return x.t<y.t;
}
map<int,int>s;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].t;
		d[i]=a[i].t;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		s[a[i].t]=i;
	}
	for(int i=1;i<n;i++){
		b[i]=abs(a[i].x-a[i+1].x)/abs(a[i].t-a[i+1].t);
		c[i]=b[i];
	}
	sort(c+1,c+n);
	int len=unique(c+1,c+n)-c-1;
	int num=0,cnum=0,ccnum=0;
	for(int i=1;i<n;i++){
		if(b[i]==c[len]) num++;
		if(b[i]==c[len-1]) cnum++;
		if(len-3>0&&b[i]==c[len-2]) ccnum++;
	}
	a[n+1].t=1e9+1;
	a[0].t=-1;
	while(m--){
		cin>>u>>v;
		u=s[d[u]];
		if(v<a[u+1].t&&v>a[u-1].t){//内部 
			int nV=max(abs(a[u].x-a[u-1].x)/abs(v-a[u-1].t),abs(a[u+1].x-a[u].x)/abs(a[u+1].t-v));
			int ok=0;
			if(b[u-1]==c[len]) ++ok;
			if(b[u]==c[len]) ++ok;
			if(num-ok>0){//仍然有 
				cout<<max(c[len],nV)<<endl;
			}else{
				ok=0;
				if(b[u-1]==c[len-1]) ++ok;
				if(b[u]==c[len-1]) ++ok;
				if(cnum-ok>0){
					cout<<max(c[len-1],nV)<<endl;
				}else{
					if(len-2<=0) cout<<nV<<endl;
					else cout<<max(c[len-2],nV)<<endl;
				}
			}
		}else{//在外部 
			if(v>a[u+1].t){//在右边二分 
				int l=u,r=n+1;
				while(l<r-1){
					int mid=l+r>>1;
					if(v>a[mid].t) l=mid;
					else r=mid;
				}
//				l~l+1
				int nV1=max(abs(a[u].x-a[l].x)/abs(v-a[l].t),abs(a[l+1].x-a[u].x)/abs(a[l+1].t-v));
				int nV2=0;
				if(u>1&&u<n) nV2=abs(a[u+1].x-a[u-1].x)/abs(a[u+1].t-a[u-1].t);
				int nV=max(nV1,nV2);
				int ok=0;
				if(b[u-1]==c[len]) ++ok;
				if(b[u]==c[len]) ++ok;
				if(b[r]==c[len]) ++ok;
				//损失ok个最大值
				if(num-ok>0){
					cout<<max(c[len],nV)<<endl;
				}else{
					ok=0;
					if(b[u-1]==c[len-1]) ++ok;
					if(b[u]==c[len-1]) ++ok;
					if(b[r]==c[len-1]) ++ok;
					if(cnum-ok>0){
						cout<<max(c[len-1],nV)<<endl;
					}else{
						if(len-2<=0){
							cout<<nV<<endl;
							continue;
						}
						ok=0;
						if(b[u-1]==c[len-2]) ++ok;
						if(b[u]==c[len-2]) ++ok;
						if(b[r]==c[len-2]) ++ok;
						if(ccnum-ok>0){
							cout<<max(c[len-2],nV)<<endl;
						}else{
							if(len-3<=0){
								cout<<nV<<endl;
							}else{
								cout<<max(c[len-3],nV)<<endl;
							}
						}
					}
				}
			}else{
				int l=0,r=u;
				while(l<r-1){
					int mid=l+r>>1;
					if(v>a[mid].t) r=mid;
					else l=mid;
				}
				int nV1=max(abs(a[u].x-a[r].x)/abs(v-a[r].t),abs(a[r+1].x-a[u].x)/abs(a[r+1].t-v));
				int nV2=abs(a[u+1].x-a[u-1].x)/abs(a[u+1].t-a[u-1].t);
				int nV=max(nV1,nV2);
				int ok=0;
				if(b[u-1]==c[len]) ++ok;
				if(b[u]==c[len]) ++ok;
				if(b[r]==c[len]) ++ok;
				//损失ok个最大值
				if(num-ok>0){
					cout<<max(c[len],nV)<<endl;
				}else{
					ok=0;
					if(b[u-1]==c[len-1]) ++ok;
					if(b[u]==c[len-1]) ++ok;
					if(b[r]==c[len-1]) ++ok;
					if(cnum-ok>0){
						cout<<max(c[len-1],nV)<<endl;
					}else{
						if(len-2<=0){
							cout<<nV<<endl;
							continue;
						}
						ok=0;
						if(b[u-1]==c[len-2]) ++ok;
						if(b[u]==c[len-2]) ++ok;
						if(b[r]==c[len-2]) ++ok;
						if(ccnum-ok>0){
							cout<<max(c[len-2],nV)<<endl;
						}else{
							if(len-3<=0){
								cout<<nV<<endl;
							}else{
								cout<<max(c[len-3],nV)<<endl;
							}
						}
					}
				}
			}
		}
	}
	return 0;
}
2024/9/7 20:17
加载中...