E.XKC's basketball team
ps:
比赛过程中读错题了,而且一直没发现(好难受)。以为要求满足要求的个数,一直没有思路,没想到是求最长距离,那就很容易了。
solution:
贪心的从后往前维护一个单调递增序列,因为对于i<j,a[i]<=a[j],对于i之前的数那么a[j]可以完全替代a[i]的作用。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=5e5+5; 4 typedef long long ll; 5 6 inline int read() 7 { 8 char ch=getchar();int x=0,f=0; 9 while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar(); 10 while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); 11 return f?-x:x; 12 } 13 14 15 int a[maxn]; 16 int num[maxn]; 17 vector <int > V; 18 int main(){ 19 int n,m;n=read();m=read(); 20 for(int i=1;i<=n;i++) a[i]=read(); 21 V.push_back(n);num[n]=-1; 22 for(int i=n-1;i>=1;i--){ 23 int tmp=a[i]+m; 24 int l=0;int r=V.size()-1; 25 int ans=-1; 26 while(l<=r){ 27 int mid=(l+r)/2; 28 if(a[V[mid]]>=tmp) 29 { 30 ans=max(ans,V[mid]); 31 r=mid-1; 32 } 33 else{ 34 l=mid+1; 35 } 36 } 37 if(ans==-1) num[i]=ans; 38 else num[i]=ans-i-1; 39 if(a[i]>a[V[V.size()-1]]) V.push_back(i); 40 41 } 42 for(int i=1;i<=n;i++){ 43 if(i==1) cout <<num[i]; 44 else cout <<" "<<num[i]; 45 } 46 return 0; 47 }