Codeforces.1082E.Increasing Frequency(思路)
\(Description\)
给定\(n\)个数。你可以选择一段区间将它们都加上或减去任意一个数。求最终序列中最多能有多少个数等于给定的\(C\)。
\(n\leq5\times10^5\)。
\(Solution\)
先记一个表示\(C\)的个数的前缀和\(sum_i\)。
选择修改的区间\([l,r]\)一定满足\(A_l=A_r\)且都是由\(A_l\)变成\(C\)。所以我们枚举右端点,对每种权值单独考虑。
那么\(A_r\)要么是由前面某个等于\(A_r\)的数转移过来,要么\(l\)直接等于\(r\)。
所以记\(mx_{a_i}\)为之前\(a_i\)这个数的最大贡献,那么$$mx_{a_i}=\max{\ mx_{a_i}+1,\ \ sum_{i-1}+1}$$
\(Ans=\max\{mx_{a_i}+sum_n-sum_i\}\)。
for一遍就行啦。
//31ms 6700KB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=5e5+5;
int A[N],sum[N],mx[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
const int n=read(),C=read();
for(int i=1; i<=n; ++i) sum[i]=sum[i-1]+((A[i]=read())==C);
int ans=0; const int sn=sum[n];
for(int i=1; i<=n; ++i)
mx[A[i]]=std::max(mx[A[i]],sum[i-1])+1, ans=std::max(ans,mx[A[i]]+sn-sum[i]);
printf("%d\n",ans);
return 0;
}
Codeforces.1082E.Increasing Frequency(思路)的更多相关文章
- CF 1082E Increasing Frequency(贪心)
传送门 解题思路 贪心.对于一段区间中,可以将这段区间中相同的元素同时变成\(c\),但要付出的代价是区间中等于\(c\)的数的个数,设\(sum[i]\)表示等于\(c\)数字的前缀和,Max[i] ...
- Educational Codeforces Round 55 (Rated for Div. 2):E. Increasing Frequency
E. Increasing Frequency 题目链接:https://codeforces.com/contest/1082/problem/E 题意: 给出n个数以及一个c,现在可以对一个区间上 ...
- CodeForces 1082 E Increasing Frequency
题目传送门 题意:给你n个数和一个c, 现在有一个操作可以使得 [ l, r ]区间里的所有数都加上某一个值, 现在问你c最多可以是多少. 题解: pre[i] 代表的是 [1,i] 中 c 的个数是 ...
- Codeforces 845C. Two TVs 思路:简单贪心算法
题目: 题目原文链接:http://codeforces.com/contest/845/problem/C 题意:现在我们有一个电视清单,有两个电视,电视清单上有每一个节目的开始时间和结束时间. 电 ...
- Codeforces 1168A Increasing by Modulo
题目链接:http://codeforces.com/problemset/problem/1168/A 题意:给一个数组,数组中元素范围为0~n,每次你可以选择若干元素进行(ai+1)%m的操作,问 ...
- CF1082E:E.increasing Frequency(贪心&最大连续和)
You are given array a a of length n n . You can choose one segment [l,r] [l,r] (1≤l≤r≤n 1≤l≤r≤n ) an ...
- CodeForces - 963D:Frequency of String (bitset暴力搞)
You are given a string ss. You should answer nn queries. The ii-th query consists of integer kiki an ...
- codeforces 883M. Quadcopter Competition 思路
M. Quadcopter Competition time limit per test 3 seconds memory limit per test 256 megabytes input st ...
- codeforces div2 C题思路训练【C题好难,我好菜】
1017C The Phone Number: 构造数列使得LIS和LDS的和最小,定理已知LIS=L,LDS=n/L的向上取整,根据样例可以得到设置L=根号n,构造方法如样例 截断法构造,不用考虑边 ...
随机推荐
- cf1143E 倍增好题!
一开始感觉用莫队可以搞一下,但是看了题解才发现这题其实是倍增套路题 把排列转换成nxt数组,然后倍增dp[i][j]表示第i个数后面有(1<<j)个数的最靠左的区间 然后从右往左扫一次即可 ...
- WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Exception in thread "main" java.io.IOException: No FileSystem for sc F
1.执行脚本程序报如下所示的错误: [hadoop@slaver1 script_hadoop]$ hadoop jar web_click_mr_hive.jar com.bie.hive.mr.C ...
- POJ 2914 Minimum Cut【最小割 Stoer-Wangner】
题意:求全局最小割 不能用网络流求最小割,枚举举汇点要O(n),最短增广路最大流算法求最大流是O(n2m)复杂度,在复杂网络中O(m)=O(n2),算法总复杂度就是O(n5):就算你用其他求最大流的算 ...
- JSP基础知识➣语法整理(二)
A.脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式:<% 代码片段 %>,但是不能包含文件的方法和变量的声明 B.J ...
- MaterialEditText——Android Material Design EditText控件
MaterialEditText是Android Material Design EditText控件.可以定制浮动标签.主要颜色.默认的错误颜色等. 随着 Material Design 的到来, ...
- Coolpy开源项目简介
1.Coolpy初识 基于ARDUINO的迷你操作系统.只需一个ARDUINO主板+Ethernet Shield即可运行.成本低,Coolpy主件以目前淘宝价只需要76元人民币. 2.Coolpy能 ...
- ArcGIS Engine 10.x许可代码
相比9.3,10.x许可代码的书写改变了,ArcObjects SDK 10 Microsoft .NET Framework 帮助文档中,提供了以下两种方式: 1. Calling RuntimeM ...
- net core体系-网络数据采集(AngleSharp)-1初探
有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: ...
- Linux read line
cat ./port_list|while read linedo done
- python josn包
Python josn包中的编码与解码方法 对于Python数据类型进行编码解码 json.dumps 对python的数据类型进行json格式编码 :(将dict转为json格式) eg: imp ...