原题链接

题意

  • 给我们一个长为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. PackageManager

    /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Versi ...

  2. 洛谷 P9518 queue

    一眼模拟. 需要维护的东西可以根据操作求得: start:正在玩游戏的 \(1\) 或 \(2\) 个人: arrive:当前在排队但没玩游戏的队列.每个人是否在排队.游玩: leave:每个人是否在 ...

  3. [ABC212E] Safety Journey 题解

    Safety Journey 题目大意 给定一张缺少了 \(m\) 条边的 \(n\) 个点的完全图和一个正整数 \(k\),你需要求出满足以下条件的序列 \(A\) 的数量: \(A\) 的长度为 ...

  4. 使用aop(肉夹馍)为BlazorServer实现统一异常处理

    背景 用户做一个操作往往对应一个方法的执行,而方法内部会调用别的方法,内部可能又会调用别的方法,从而形成一个调用链.我们一般是在最顶层的方法去加try,而不是调用链的每一层都去加try. 在web开发 ...

  5. Go 常用标准库之 fmt 介绍与基本使用

    Go 常用标准库之 fmt 介绍与基本使用 目录 Go 常用标准库之 fmt 介绍与基本使用 一.介绍 二.向外输出 2.1 Print 系列 2.2 Fprint 系列 2.3 Sprint 系列 ...

  6. 系统RAM几乎爆满与解决方法

    先说一遍,遇事不决就重启! 在电脑长时间运转下某些无良应用程序会产生大量的临时文件(目前我怀疑是有道云笔记) 最终导致系统爆炸 附图 在这种情况下,我下载了RAM实时监测我内存占用情况 结果发现pag ...

  7. 代替gets()的新操作

    1 scanf("%[^\n]", s); ^是"非"  \n是换行 所以这就是一直读到\n才结束

  8. [Flink] Flink(CDC/SQL)Job在启动时,报“ConnectException: Error reading MySQL variables: Access denied for user 'xxxx '@'xxxx' (using password: YES)”(1个空格引发的"乌龙")

    1 问题描述 1.1 基本信息 所属环境:CN-PT 问题时间:2023-11-21 所属程序: Flink Job(XXXPT_dimDeviceLogEventRi) 作业类型: Flink SQ ...

  9. Jdk_HashMap 源码 —— hash(Object)

    Jdk 源码 HashMap 的源码是在面试中考的算是比较多的,其中有很多高性能的经典写法,也值得多学习学习. 本文是本人在阅读和学习源码的过程中的笔记(不是教程),如有错误欢迎指正. Jdk Ver ...

  10. Python 潮流周刊#28:两种线程池、四种优化程序的方法

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.本周刊开源,欢迎投稿.另有电报频道作为副刊,补充发布更加丰富的资讯. 产品推荐 Walles.AI 是一款适用于所 ...