感觉对CF的套路题稍微有点感觉了
考虑特殊条件性质就好了....
题意:
定义一个序列的分数为s1*s2*s3*..../d!
给定一个序列,问对于1<=k<=n,设a1~ak这个序列中的这么多个子序列中分数最大的为m,问这些子序列中分数为m的最长子序列的长度
思路:
对题中的条件一点点分析就好了
子序列:考虑将其特殊化,化成子段
递增:考虑从末尾开始取子段
s1*s2*s3*....*sk/d!:计算贡献,往前取子段,当a[l]<r-l+1的时候贡献变小,因此这个可以作为l的条件
所以综上,双指针就可以解决
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
int n;
int a[mxn];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int l=1;
vector<int> v;
for(int r=1;r<=n;r++){
while(l<r&&a[l]<r-l+1) l++;
v.push_back(r-l+1);
}
for(int i=0;i<v.size();i++) cout<<v[i]<<" \n"[i==v.size()-1];
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}