绝对半径2051
题意:给定一个序列,你可以最多删除k个数,问序列的最长相同序列。
思路:尺取法,对于一段区间l,r它连接区间里面的两个相同的子序列需要花费
r-l-m[a[l]],m[a[l]]是这段区间里面a[l]的数目,最后对答案取一下max,改区间统计完后清空a[l]的数量。
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
ios::sync_with_stdio(false);
int n,k;
map<int,int>m;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
int i=1,j=1,ans=0;
while(i<=n){
while(j<=n&&j-i-m[a[i]]<=k)
m[a[j++]]++;
ans=max(ans,m[a[i]]);
m[a[i++]]--;
while(i<=n&&a[i]==a[i-1])
m[a[i++]]--;
}
cout<<ans<<"\n";
}