传送门

解题思路

  贪心。对于一段区间中,可以将这段区间中相同的元素同时变成\(c\),但要付出的代价是区间中等于\(c\)的数的个数,设\(sum[i]\)表示等于\(c\)数字的前缀和,Max[i]表示数字\(i\)的最大个数。那么只要\(O(n)\)的扫一遍,维护一下每个数字的\(max\),具体做法是看一下\(Max[a[i]]\)大还是\(sum[i]\)大,如果\(sum\)大的话,说明前面都不变,直接把\(Max\)赋值成\(sum[i]+1\),否则直接让\(Max[i]++\),然后每次跟后面的\(sum\)并到一起更新一次答案。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector> using namespace std;
const int MAXN = 500005; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,c,a[MAXN],sum[MAXN],Max[MAXN],ans,pre[MAXN]; inline int max(int x,int y){
return x>y?x:y;
} int main(){
n=rd(),c=rd();int now;
for(int i=1;i<=n;i++) {
sum[i]=sum[i-1];a[i]=rd();
if(a[i]==c) sum[i]++;
}
for(int i=1;i<=n;i++){
if(a[i]==c) continue;
now=sum[i];
if(now>=Max[a[i]]) Max[a[i]]=now+1;
else Max[a[i]]++;
ans=max(ans,Max[a[i]]+sum[n]-sum[i]);pre[a[i]]=i;
}
printf("%d\n",max(ans,sum[n]));
return 0;
}

最新文章

  1. 做技术最自由,在IT最幸福!
  2. __iter__
  3. tomcat 配置
  4. 10位顶级PHP大师的开发原则
  5. Azure PowerShell (一)如何安装和配置 Azure PowerShell
  6. innerHTML在IE中报错
  7. springMVC注解及优化
  8. Opencv-2017-7-18
  9. 解决项目无法添加VBIDE问题
  10. CS229 6.7 Neurons Networks whitening
  11. OCP新题,2019题库出现大量新题,062-第22题
  12. leetCode题解之Self Dividing Numbers
  13. Web Api 中返回JSON的正确做法(转)
  14. XtraBackup出现 Can&#39;t connect to local MySQL server through socket &#39;/var/run/mysqld/mysqld.sock&#39;
  15. ios 中不new Date 的格式 不支持年月日 以‘-’ 分割的格式
  16. ubuntu调错
  17. 《OD大数据实战》环境整理
  18. 内联函数背景、例子、与普通函数的区别及要注意的地方 ------新标准c++程序设计
  19. bzoj 1096 斜率优化DP
  20. OpenJudge 2727 仙岛求药

热门文章

  1. JavaScript面向对象小抄集
  2. 阿里云异构计算团队亮相英伟达2018 GTC大会
  3. Springboot项目静态资源配置
  4. 网页head头部meta和link标签使用大全
  5. python数据结构:进制转化探索
  6. 3. Node_export安装部署
  7. JAVA中一个汉字占多少个字符(转载)
  8. 字母加密-C基础
  9. 2019牛客多校第⑨场H Cutting Bamboos(主席树+二分)
  10. DNS域名解析服务以及Bind服务程序