【CF】E. Increasing Frequency

E. Increasing Frequency

将整条区间取某一连续区间,并向这段连续区间内所有的数字进行加减,求最终整条区间达到某一特定值的个数最大,求这个个数为多少。

设特定值为c

取任意一段区间,其中c的个数为m,这一区间内其他数字(a_i)的个数为(A_i),若存在某一个i,使得(A_i)>m的话,那么可以通过加减,使得(a_i)

提前处理好suf数组,用存储第i个位置前有几个c

f[A[i]]表示的是第i个位置以后最优的c的个数

在A[i]!=c的前提下,f[A[i]]等于上一个f[A[i]]的位置的最优结果再加上i这个位置的答案,或者是i位置后所有c个数再加上对位置i的改动的两者的最大值。

#include <bits/stdc++.h>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
using namespace std;
const int N = 5E5+10;
int n,c,A[N],f[N],pre[N],suf[N];
int main()
{
	cin>>n>>c;
    for(int i=1;i<=n;i++)
    {
    	cin>>A[i];
    	pre[i]+=(A[i]==c)+pre[i-1];
	}
	int ans=0;
	for(int i=n;i>=1;i--)
	{
		f[A[i]]=max(f[A[i]],suf[i+1])+1;
		suf[i]=suf[i+1]+(A[i]==c);
		ans=max(ans,f[A[i]]+pre[i-1]);
	}
	cout<<ans;
	
	return 0;
}

原文地址:https://www.cnblogs.com/BeautifulWater/p/15292165.html