Codeforces Round #116 (Div. 2, ACM-ICPC Rules) E. Cubes (尺取)
2024-08-26 14:04:51
题目链接:http://codeforces.com/problemset/problem/180/E
给你n个数,每个数代表一种颜色,给你1到m的m种颜色。最多可以删k个数,问你最长连续相同颜色的序列的长度是多少。
将相同颜色的下标存到对应颜色的容器中,比如ans[a[i]].push_back(i)就是将下标为i颜色为a[i]的数存到ans[a[i]]容器中。
对于每种颜色序列,尺取一下 在差距小于k的情况下取能取到的最大长度。
//#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e5 + ;
vector <int> ans[N];
int a[N*]; int solve(int u, int k) {
int len = ans[u].size(), notcnt = , cnt = , l = , res = ;
//notcnt表示中间删除数的多少,cnt表示颜色为u的序列的长度
for(int i = ; i < len; ++i) {
int v = ans[u][i];
notcnt += v - ans[u][i - ] - ;
cnt++;
while(notcnt > k && l <= i) {
notcnt -= ans[u][l + ] - ans[u][l] - ;
cnt--;
l++;
}
res = max(cnt, res);
}
return res;
} int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
for(int i = ; i <= n; ++i) {
scanf("%d", a + i);
ans[a[i]].push_back(i);
}
int res = ;
for(int i = ; i <= m; ++i) {
if(ans[i].size()) { //要是存在颜色为i的数
res = max(res, solve(i, k));
}
}
printf("%d\n", res);
return ;
}
最新文章
- Win7下Hyenae的安装
- 工程环境搭建和网站部署(java)
- Android OkHttp完全解析 --zz
- 在Android Studio中用Gradle添加Robolectric
- python多线程备份MYSQL数据库并删除旧的备份。
- POSIX字符类
- promise理解
- C++二维数组动态内存分配
- tomcat------https单向认证和双向认证
- SAX解析XML文件实例代码
- HTML知识点
- my first blogs(我的处女博)
- Github Page--CSDN新人的第二选择
- 此主机支持Intel VT-x,但Intel VT-x处于禁用状态
- leetcode26: 删除排序数组中的重复项
- PS提亮户外儿童照
- JavaScript的BOM编程,事件-第4章
- ES6 新增数据类型检测 Set Map Proxy
- C#下编程完成IIS网络App的权限设置
- Java集合----概述、Collection接口、Iterator接口