4 条题解

  • 2
    @ 2024-11-23 9:43:46

    由于给出的站点都是单调的,所以可以二分查找,时间复杂度O(nlogn)

    #include<bits/stdc++.h>
    using namespace std;
    int const N=1e5+10;
    int a[N];
    int L[N],R[N],k,n;
    int get(int p,int f)//f=1时找左边,f=0时找右边
    {
    	if(f)
    	{
    		int l=1,r=p,ans;
    		while(l<=r)
    		{
    			int mid=(l+r)>>1;
    			if(abs(a[mid]-a[p])>k) l=mid+1;
    			else r=mid-1,ans=mid; 
    		}
    		return ans;
    	}
    	else
    	{
    		int l=p,r=n,ans;
    		while(l<=r)
    		{
    			int mid=(l+r)>>1;
    			if(abs(a[mid]-a[p])>k) r=mid-1;
    			else l=mid+1,ans=mid; 
    		}
    		return ans;
    	}
    }
    int main()
    {
    	cin>>n>>k;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	L[1]=1,R[n]=n;
    	for(int i=1;i<=n;i++)
    	{
    		if(i==1)
    		{
    			int res=get(i,0);
    			R[i]=res;
    		}
    		else if(i==n)
    		{
    			int res=get(i,1);
    			L[i]=res;
    		}
    		else
    		{
    			int res=get(i,1);
    			L[i]=res;
    			res=get(i,0);
    			R[i]=res;
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		cout<<L[i]<<" "<<R[i]<<endl;
    	}
    	return 0;
    }
    

    信息

    ID
    954
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    (无)
    递交数
    242
    已通过
    33
    上传者