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;
}
}