80pts求助
查看原帖
80pts求助
373530
Reply_楼主2024/9/8 19:38

Wa on 2 and 5

#include<bits/stdc++.h>
#define int long long int
#define R register
#define F(i,a,b) for(int i = (a);i<=(b);i++)
using namespace std;
inline int read(){R int x=0,t=1;R char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*t;}
int x[50000001],t[50000001],d[5000001];
int s[50000001],n,m;
struct Node
{
	int x,t,id;
}a[20000011];
inline bool cmp(Node xx,Node yy)
{
	return xx.t<yy.t;
}
priority_queue<int>q;
int find(int v)
{
	int l=1,r=n;
	while(l<r){
		int mid=(l+r)/2;
	//	cout << l << " " << r << '\n';
		//cout << a[mid].t << " " << v << '\n';
		if(a[mid].t<=v) l=mid+1;
		else r=mid;
	}
	//if(v==100){
	//	cout << "%%%";
	//}
	F(i,r,l){
		if(a[i].t>=v) return i;
	}
	return n+1;
}
inline void solve()
{
	//0  1 3 5  7
	n=read(),m=read();
	F(i,1,n){
		a[i].x=read(),a[i].t=read(),a[i].id=i;
		if(i>1){
			int vv=abs(a[i-1].x-a[i].x)/abs(a[i-1].t-a[i].t);
			q.push(vv);
		}
	}
	sort(a+1,a+1+n,cmp);
	for(int i = 1;i<=n;i++) d[a[i].id]=i;
	F(i,1,n){
		if(i>1){
			int vv=abs(a[i-1].x-a[i].x)/abs(a[i-1].t-a[i].t);
			q.push(vv);
		}
	}
	if(n==3){
		assert(0);
	}
	F(i,1,m){
		int u=read(),v=read();
		u=d[u];
		if(v==a[u].t){
			cout << q.top() << '\n';
			continue;
		}
		int v1=abs(a[u-1].x-a[u].x)/abs(a[u-1].t-a[u].t);
		int v2=abs(a[u+1].x-a[u].x)/abs(a[u+1].t-a[u].t);
		int maxn=0,sum=abs(a[u+1].x-a[u-1].x)/abs(a[u+1].t-a[u-1].t);
		if(v1<v2)swap(v1,v2);
		if(q.top()==v1){
			q.pop();
			if(q.top()==v2){
				q.pop();
				sum=q.top();
				q.push(v2);
			}
			else{
				sum=max(sum,q.top());
				q.push(v1);
			}
		}
		else{
			sum=q.top();
		}
		int new_loc=find(v);
		if(new_loc!=n+1){
			if(new_loc==u){
				if(new_loc!=n){
					new_loc++;
					v2=abs(a[new_loc].x-a[u].x)/abs(a[new_loc].t-v);
					new_loc--;
				}
			}
			else
			{
				v2=abs(a[new_loc].x-a[u].x)/abs(a[new_loc].t-v);
			}
		}
		if(new_loc!=1){
			if(new_loc-1==u){
				if(new_loc!=2){
				new_loc--;
				v1=abs(a[new_loc-1].x-a[u].x)/abs(a[new_loc-1].t-v);
				new_loc++;
				}
			}
			else
			{
				v1=abs(a[new_loc-1].x-a[u].x)/abs(a[new_loc-1].t-v);
			}
		}
		sum=max({sum,v1,v2});
		cout << sum << '\n';
	}
}
signed main()
{
	solve();
	return 0;	
}

2024/9/8 19:38
加载中...