ARC170B - Arithmetic Progression Subsequence
wflengxuenong · · 题解
- 题目大意
给定一个长度为
- 题目分析
为了不重不漏的统计,我们限定右端点
已知
如何去维护
再维护一个
时间复杂度为
- 参考代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[100005];
int mp[11][11],l[11];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0,lf=0,mlf=0;
//对每一个右端点q,找其符合要求的最近左端点lf,和前缀最大左端mlf点比较 ans+=mlf
for(int k=1;k<=n;k++) {
for(int d=-4;d<=4;d++){//枚举公差
if(a[k]+2*d>=1&&a[k]+2*d<=10)lf=max(lf,mp[a[k]+2*d][a[k]+d]);
mlf=max(mlf,lf);
}
ans+=mlf;
for(int i=1;i<=10;i++){
if(l[i])mp[i][a[k]]=l[i];
}
l[a[k]]=k;
}
cout<<ans<<endl;
}