CodeForces - 1082E Increasing Frequency(DP)

题意:可以选一段区间[ l , r ],将该区间全部加上k,问你这样操作一次之后数组中最多能有多少数字等于c

(1)假设我们要对[l,r]区间操作,那么必须保证a[l]+k=c,否则我们可以把原区间缩成[l+1,r],r同理,由此可知我们选出的一段区间[l,r]必须满足a[ l ] = a[ r ],且加的k也是固定的。进一步推得考虑该问题时应该分数字讨论
(2)考虑现在选出一段区间[l,r],对该区间操作之后,该区间中原来等于ar的变为c,原来的c不再是c。用sum表示 1 ~ i 中等于c的数目,cnt表示 1 ~ i中等于ai的数字个数。对于一个固定的区间右边界r,答案即为:
max(sum[ l - 1 ] + cnt[ r ] - cnt[ l - 1 ] + sum[ n ] - sum[ r ] )(l<r 且al = ar)

所以我们枚举r,同时维护出对于每个数字最大的sum[ l -1] - cnt[l - 1] 即可

map<int,int>tot;//用于计数
int sum[MX],cnt[MX];//sum:1~i等于c的数字数目,cnt:1~i中等于i的数字数目
vector<int>v[MX];//存储每个数字出现的坐标
set<int>s;
signed main()
{
    int n,c;cin>>n>>c;
    rpp(i,n) 
    {
        int x;cin>>x;
        sum[i]=sum[i-1]+(x==c?1:0);
        cnt[i]=++tot[x];
        v[x].push_back(i);
        s.insert(x);
    }
    int ans=sum[n];//
    for(auto _:s)//枚举每个数字
    {
        int mx=0;
        for(auto x:v[_])
        {
            mx=max(mx,sum[x-1]-(cnt[x]-1));//这里要注意公式中cntl-1代表1~l-1中与al相等的数目,不能直接用cntl-1
            ans=max(ans,mx+cnt[x]+sum[n]-sum[x]);
        }
    }
    cout<<ans<<endl;
    stop;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值