博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 1082 E Increasing Frequency
阅读量:6896 次
发布时间:2019-06-27

本文共 1316 字,大约阅读时间需要 4 分钟。

题意:给你n个数和一个c, 现在有一个操作可以使得 [ l, r ]区间里的所有数都加上某一个值, 现在问你c最多可以是多少。

题解:

pre[i] 代表的是 [1,i] 中 c 的个数是多少。

suf[i] 代表的是 [i,n] 中 c 的个数是多少。

我们可以处理出这些信息。

然后我们从后往前处理信息。

现在给定一个b[x], b[x] 记录的是 [l, r] 中 x 的个数 + [r+1, n] 中 c的个数。

那么 每次出现一个新的 x, 现在可以转移到b[x]的状态是 max(b[x], suf[i+1]) + 1。

然后我们对答案求最大就好了。

 

#include
using namespace std;#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);#define LL long long#define ULL unsigned LL#define fi first#define se second#define pb push_back#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define lch(x) tr[x].son[0]#define rch(x) tr[x].son[1]#define max3(a,b,c) max(a,max(b,c))#define min3(a,b,c) min(a,min(b,c))typedef pair
pll;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const LL mod = (int)1e9+7;const int N = 5e5 + 100;int a[N];int b[N];int suf[N];int pre[N];int main(){ int n, c; scanf("%d%d", &n, &c); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); int ans = 0; for(int i = 1; i <= n; ++i) pre[i] = pre[i-1] + (a[i] == c); for(int i = n; i >= 1; --i){ b[a[i]] = max(b[a[i]], suf[i+1]) + 1; suf[i] = suf[i+1] + (c == a[i]); ans = max(ans, pre[i-1]+b[a[i]]); } cout << ans << endl; return 0;}
View Code

 

转载于:https://www.cnblogs.com/MingSD/p/10052773.html

你可能感兴趣的文章
wordpress无法更新为最新版本
查看>>
爬虫代码编写中会遇到的字符处理的坑
查看>>
SSM-Spring-09:Spring中jdk动态代理
查看>>
我为NET狂官方面试题-数据库篇
查看>>
HBase集群安装
查看>>
Ubuntu终端字体大小设置快捷键
查看>>
[20180625]函数与标量子查询13(补充)
查看>>
Python面试问题整理(附答案)
查看>>
设计模式—装饰模式的C++实现
查看>>
MySQL:Innodb page clean 线程 (二) 解析
查看>>
Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)
查看>>
正确配置Kubelet可一定程度防止K8S集群雪崩
查看>>
Content Aware ABR技术
查看>>
你可以这么理解五种I/O模型
查看>>
巧妙的CSS
查看>>
Spring系列之Spring框架和SpringAOP集成过程分析(十一)
查看>>
云数据库产品月刊·5月刊
查看>>
50行代码的MVVM,感受闭包的艺术
查看>>
Android第三方开源图片裁剪截取:cropper
查看>>
直播转点播实践
查看>>