Diamond Collector S
题目链接:https://www.luogu.com.cn/problem/P3143
题意:
在给定的数组上 找到两个 最大的 极差不大于k 的子序列。输出其长度之和
思路:
贪心地,先将数组排序,然后选择两个区间即可
通过滑动窗口选出以每个节点为左端点的最大窗口大小
后缀最大值优化查询
void solve(){
int n,k;cin>>n>>k;
vector<int>a(n+1);
rep(i,1,n)cin>>a[i];
sort(a.begin()+1,a.end());
int r=1;
vector<int>nums(n+5,0);
rep(i,1,n){
while(r<=n&&a[r]-a[i]<=k){
r++;
}
nums[i]=r-i;
}
vector<int>suf(n+5);
for(int i=n;i>=1;i--){
suf[i]=max(suf[i+1],nums[i]);
}
int ans=-1;
rep(i,1,n){
ans=max(ans,nums[i]+suf[min(n+1,i+nums[i])]);
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号