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;
}
posted @ 2025-04-26 11:13  Marinaco  阅读(57)  评论(0)    收藏  举报
//雪花飘落效果