2021 南京 C

C. Klee in Solitary Confinement

我们先选出x和x+k两个数单独操作
我们统计的是x+k的最大贡献
转化题意
我们可以直接记录一个操作前x+k的贡献
然后再选取一个区间 就相当于 当前x+k就是-1的贡献 而x就是+1的贡献
这样就变成了我们之前的很金典的问题:选出一段连续区间让其价值最大。
直接套板子就可以了

void solve(){
    int n,k;cin>>n>>k;
    vector<int>v(4e6+10),a(n+10),add(4e6+10);
    int mx=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i]+=2e6;
        v[a[i]]++;
        mx=max(mx,v[a[i]]);
    }
    if(k==0){
        cout<<mx<<endl;
    }else{
        int ans=0;
        for(int i=1;i<=n;i++){
            add[a[i]]=max(0ll,add[a[i]]-1);
            add[a[i]+k]++;
            ans=max(ans,add[a[i]+k]+v[a[i]+k]);
        }
        cout<<ans<<endl;
    }
}
posted @ 2022-11-20 00:23  ycllz  阅读(32)  评论(0)    收藏  举报