4 条题解
-
2
由于给出的站点都是单调的,所以可以二分查找,时间复杂度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; }
-
0
#include <bits/stdc++.h> using namespace std; const int N = 1e5+5; int n,k; int a[N]; int main() { cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { int l=lower_bound(a+1,a+1+n,a[i]-k)-a; int r=lower_bound(a+1,a+1+n,a[i]+k)-a; if(a[r]-a[i]>k) r--; if(r==n+1) r--; cout<<l<<' '<<r<<'\n'; } return 0; }
- 1
信息
- ID
- 954
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 242
- 已通过
- 33
- 上传者