zoukankan      html  css  js  c++  java
  • 【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;
    }
    
    
  • 相关阅读:
    [学习笔记]康托展开
    [模板]平衡树
    [题解]涂色
    [学习笔记]Lucas定理
    欧拉定理及其证明
    一些杂题(排列组合
    swift 动画合集
    UIDynamicAnimator UIKit动力学
    swift 当协议遇见了泛型
    Swift 协议
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15292165.html
Copyright © 2011-2022 走看看