标签:
题目链接: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的情况下取能取到的最大长度。
1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <vector> 8 #include <cmath> 9 #include <ctime> 10 #include <list> 11 #include <set> 12 #include <map> 13 using namespace std; 14 typedef long long LL; 15 typedef pair <int, int> P; 16 const int N = 1e5 + 5; 17 vector <int> ans[N]; 18 int a[N*2]; 19 20 int solve(int u, int k) { 21 int len = ans[u].size(), notcnt = 0, cnt = 1, l = 0, res = 1; 22 //notcnt表示中间删除数的多少,cnt表示颜色为u的序列的长度 23 for(int i = 1; i < len; ++i) { 24 int v = ans[u][i]; 25 notcnt += v - ans[u][i - 1] - 1; 26 cnt++; 27 while(notcnt > k && l <= i) { 28 notcnt -= ans[u][l + 1] - ans[u][l] - 1; 29 cnt--; 30 l++; 31 } 32 res = max(cnt, res); 33 } 34 return res; 35 } 36 37 int main() 38 { 39 int n, m, k; 40 scanf("%d %d %d", &n, &m, &k); 41 for(int i = 1; i <= n; ++i) { 42 scanf("%d", a + i); 43 ans[a[i]].push_back(i); 44 } 45 int res = 1; 46 for(int i = 1; i <= m; ++i) { 47 if(ans[i].size()) { //要是存在颜色为i的数 48 res = max(res, solve(i, k)); 49 } 50 } 51 printf("%d\n", res); 52 return 0; 53 }
Codeforces Round #116 (Div. 2, ACM-ICPC Rules) E. Cubes (尺取)
标签:
原文地址:http://www.cnblogs.com/Recoder/p/5724138.html