Scoring Subsequences
难度不是很大。主要是二分方式。
首先,题目要求值最大且覆盖区间最长。
因为要求最大,且序列单调递增。所以很容易想到,是从后往前取造成的贡献最大。
但是这样有一个反作用,加入说区间是 ,当前取到了 ,如果 ,那就必然说明这里就产生了小于 的数,必然要比取 要小。(可以考虑一一对应去看, 对应 , 对应 ,显然是每个 都要大于底下的那个数,这个值才可能最大)。
所以就考虑二分这个位置,然后不断地记录能取区间最大值,最后出来的就是值最大,且区间长度最大了。
用 来表示 ,时间是 。
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
int a[N],s1[N],s[N];
int Slove(int x){
int l=1,r=x,len=0,sum=0;
while(l<=r){
sum++;
if(sum>x) break;
int mid=(l+r)>>1;
if(x-mid+1<=a[mid]) len=max(len,x-mid+1),r=mid-1;
else l=mid+1;
}
cout<<len<<" ";
}
int main(){
int n,t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<1<<" ";
for(int i=2;i<=n;i++){
Slove(i);
}
cout<<endl;
}
}