原题链接

题意

  • 给我们一个长为n的序列A以及一个整数c,对这个序列的任何一个连续区间[l, r],我们可以给这个区间内的数统一加上一个我们任取的整数k。

  • 要求我们只能做上述操作一次,问最终序列内最多有多少个c

思路

  • 首先这个序列里面可能本来就有一些c,我们定义\(cnt[i]\)为前i个数内的c的个数

  • 然后对于我们选择的一段区间\([l, r]\), 我们选取其中的某个数x,然后让这个区间同加c - x, 那么得到的c的个数就是x在这个区间的的出现次数。

  • 然后我们考虑,如果我们将\([l, r]\)内的x都变成c, 则最终整个序列内的c的数量就是

    \[cnt[n] - cnt[r] + cnt[l - 1] + 区间内x的数量
    \]

    我们的任务也就是求出上式的最大值

  • 我们考虑递推解决这个问题,前三个量都可以预处理出来,但是当我们扫描到\(i\)位置,某个区间\([l, i]\)内x的数量不好求出,因为元素的值域是\([1, 5e5]\)的,所以肯定不能像\(cnt\)数组那样求。

  • 解决方法也比较简单,我们定义\(cntx[i]\)为前i个数中,\(A[i]\)的数量,然后我们可以发现,扫描到i位置时,我们只需要处理\(A[i]\)相关的信息即可,也就是说,我们只需要统计区间\([l, i](l \le i)\)中\(A[i]\)的数量即可(毕竟其他数都在之前被处理过了), 所以边扫描边更新就可以了。

  • 那如何获得某个区间内x的数量呢,这个要从我们之前的目的开始考虑,对于我们所要求的式子

    \[max_{l \le i}\{cnt[n] - cnt[i] + cnt[l - 1] + [l, i]内A[i]的数量\}
    \]

    也就是

    \[max_{l \le i}\{cnt[n] - cnt[i] + cnt[l - 1] + [0, i]内A[i]的数量 - [0, l - 1]内A[i]的数量\}
    \]

    当我们在\(i\)位置时, 有三项和\(i\)有关的为已知的定值,有两项和\(l\)有关,所以我们实际要求的是

    \[cnt[n] - cnt[i] + cntx[i] + max_{l \le i}\{cnt[l - 1] - [0, l - 1]内A[i]的数量\}
    \]
  • 显然我们使用一个数组\(Maxl[A[i]]\), 扫描的同时记录\(max_{l \le i}\{cnt[l - 1] - [0, l - 1]内A[i]的数量\}\)就可以了,然后扫描过程中先更新\(Maxl\),然后更新\(ans\)即可

AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int N = 500000; int mx[N + 5];
int cn[N + 5];
int xn[N + 5] = {0};
int aa[N + 5];
int n, c; int main()
{
scanf("%d%d", &n, &c);
cn[0] = 0;
xn[0] = 0;
for (int i = 1; i <= n; ++i)
{
scanf("%d", &aa[i]);;
cn[i] = cn[i - 1] + (aa[i] == c);
}
int ans = 0;
for (int i = 1; i <= n; ++i)
{
++xn[aa[i]];
mx[aa[i]] = max(mx[aa[i]], cn[i - 1] - xn[aa[i]] + 1);
ans = max(cn[n] - cn[i] + xn[aa[i]] + mx[aa[i]], ans);
}
printf("%d", ans);;
return 0;
}

CodeForces 1082E Increasing Frequency 计数 递推 思维的更多相关文章

  1. Codeforces.1082E.Increasing Frequency(思路)

    题目链接 \(Description\) 给定\(n\)个数.你可以选择一段区间将它们都加上或减去任意一个数.求最终序列中最多能有多少个数等于给定的\(C\). \(n\leq5\times10^5\ ...

  2. permutation 2(递推 + 思维)

    permutation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  3. codeforces D. Queue 找规律+递推

    题目链接: http://codeforces.com/problemset/problem/353/D?mobile=true H. Queue time limit per test 1 seco ...

  4. codeforces 735C Tennis Championship(贪心+递推)

    Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...

  5. 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)

    I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...

  6. LA 4123 (计数 递推) Glenbow Museum

    题意: 这种所有边都是垂直或水平的多边形,可以用一个字符串来表示,一个270°的内角记作O,一个90°的内角记作R. 如果多边形内存在一个点,能看到该多边形所有的点,则这个多边形对应的序列是合法的.这 ...

  7. [Vijos1130][NOIP2001]数的计数 (递推)

    自己的递推一塌糊涂 考前抱佛脚 #include<bits/stdc++.h> using namespace std; ]; int main() { int n;scanf(" ...

  8. Codeforces Round #260(div2)C(递推)

    有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了 ...

  9. Codeforces 429B Working out(递推DP)

    题目链接:http://codeforces.com/problemset/problem/429/B 题目大意:两个人(假设为A,B),打算健身,有N行M列个房间,每个房间能消耗Map[i][j]的 ...

  10. Yue Fei's Battle(组合计数递推)

    //求一个直径为 k 的树有多少种形态,每个点的度不超过 3 // 非常完美的分析,学到了,就是要细细推,并且写的时候要细心 还有除法取模需要用逆元 #include <iostream> ...

随机推荐

  1. 再谈http请求调用(Post与Get),项目研发的核心一环

    支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) [目录] 前言 Post请求 Get请求 与其它工具的比较 1[前言] http请求调用是开发中经常会用到的功能. ...

  2. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-21-处理鼠标拖拽-番外篇

    1.简介 前边宏哥拖拽有提到那个反爬虫机制,加了各种参数,以及加载js脚本文件还是有问题,偶尔宏哥好像发现了解决问题的办法,看到了黎明的曙光,宏哥就说试一下看看行不行,万一实现了.结果宏哥试了结果真的 ...

  3. docker简单部署

    docker 安装部署-yun yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docke ...

  4. python 远程操作svn

    SVN操作脚本 安装模块 pip install pywinrm 脚本如下 #!/usr/bin/env python3 # coding=utf-8 # author:LJX # describe: ...

  5. Unity学习笔记--基础

    基础 3D数学 Mathf函数库 print(Mathf.PI); print(Mathf.Abs(-10)); print(Mathf.CeilToInt(1.2f));//向上取整 print(M ...

  6. 为React Ant-Design Table增加字段设置

    最近做的几个项目经常遇到这样的需求,要在表格上增加一个自定义表格字段设置的功能.就是用户可以自己控制那些列需要展示. 在几个项目里都实现了一遍,每个项目的需求又都有点儿不一样,迭代了很多版,所以抽时间 ...

  7. DX后台截图C++实现代码

    DX后台截图C++实现代码 文章仅发布于https://www.cnblogs.com/Icys/p/DXGI.html和知乎上. 传统的GDI API (BitBlt)虽然可以完美的完成后台截图的任 ...

  8. Java Stream中的API你都用过了吗?

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 在本教程中,您将通过大量示例来学习 Java 8 Stream API. Java 在 Java 8 中提供了一个新的附加 ...

  9. .NET周刊【11月第2期 2023-11-12】

    国内文章 一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp https://www.cnblogs.com/Can-daydayup/p/17818557.html ...

  10. 自实现string类

    一. 环境 Linux x86_64,g++ 8.5.0 二. 实现 自实现 string 之前一直想写来着,一直拖着,现在把它完稿.这个版本是比较简单的版本,有一些可能有不同的或者更好的实现方式,后 ...