mxqz
查看原帖
mxqz
400783
Nephren_Sakura楼主2021/12/22 17:27
#include<bits/stdc++.h>
using namespace std;
int n,d,dp[1000005][30],dp2[1000005][30],lg[1000005];
struct node{
	int x,y;
}water[1000005];
void RMQ(){
	for(int j=1; j<=lg[n]; j++)
	    for(int i=1; i+(1<<j)-1<=1000000; i++)
	        dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]),dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<j-1)][j-1]);
}
bool check(int x){
	int lt,rt,mini,maxi,len;
	for(int i=1; i<=n; i++){
	    lt=water[i].x;
	    rt=lt+x;
	    len=lg[rt-lt+1];
	    maxi=max(dp[lt][len],dp[rt-(1<<len)+1][len]);
	    mini=min(dp2[lt][len],dp2[rt-(1<<len)+1][len]);
		if(abs(maxi-mini)>=x)
		    return true;
	}
	return false;
}
signed main(){
	cin>>n>>d;
	lg[0]=-1;
	for(int i=1; i<=n; i++){
	    cin>>water[i].x>>water[i].y;
	    lg[i]=lg[i>>1]+1;
	    dp2[i][0]=dp[i][0]=water[i].y;
	}
	RMQ();
	int lt=-1,rt=1e6+1;
	while(lt+1<rt){
		int mid=(lt+rt)>>1;
		if(check(mid)==true)
		    rt=mid;
		else 
		    lt=mid;
	}
	if(rt!=1e6+1)
	    cout<<rt;
	else
	    cout<<-1;
	return 0;
}
2021/12/22 17:27
加载中...