Educational Codeforces Round 5 D. Longest k-Good Segment
2016-03-22 15:51
411 查看
题目大意: 求连续最长的 k 好子序列。 如果一个序列中最多有k的不同的元素 ,这个序列叫k好子序列!
解题方法: 对于起始点1 求出他的最好子序列 1 - r, 从而你可以发现 2 - r 也是k 好子序列, 然后只需要对 r + 1 进行判断,一次类推在 O(n)时间复杂度内搞定!
代码:
解题方法: 对于起始点1 求出他的最好子序列 1 - r, 从而你可以发现 2 - r 也是k 好子序列, 然后只需要对 r + 1 进行判断,一次类推在 O(n)时间复杂度内搞定!
代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6 + 100; int a[maxn]; int vis[maxn]; int mem[maxn]; struct node { int l,r,all; } sum[maxn]; int main() { //freopen("in.txt", "r", stdin); int n,k; scanf("%d %d", &n, &k); for(int i = 0; i < n; i++) scanf("%d", &a[i]); int beginn = 0; int endd = 0; int tem = 0; int num = 0; for(int i = 0; i < n; i++) { if(!vis[a[i]]) tem++; vis[a[i]]++; num++; if(tem > k) { vis[a[i]]--; tem--; num--; endd = i-1; break; } } sum[0].l = 0; sum[0].r = num - 1; int l = 1; int r = num; tem = k; while(l < n && r < n) { if(!mem[l]) { vis[a[l - 1]] = max(vis[a[l - 1]] - 1, 0); if(vis[a[ l - 1]] == 0) { tem--; } } mem[l] = 1; //printf("l = %d r = %d vis[%d] = %d tem = %d\n", l , r, a[r], vis[a[r]], tem); if(!vis[a[r]] && tem == k) { sum[l].r = r - 1; sum[l].l = l; l++; } else if(!vis[a[r]] && tem < k) { vis[a[r]]++; r++; tem++; } else if(vis[a[r]]) { vis[a[r]]++; r++; } if(r == n) { sum[l].r = r - 1; sum[l].l = l; } } int ans = 0; for(int i = 0; i < n; i++) // printf("%d %d\n", sum[i].l + 1, sum[i].r + 1); if((sum[i].r - sum[i].l + 1) > (sum[ans].r - sum[ans].l + 1)) ans = i; printf("%d %d\n", sum[ans].l + 1, sum[ans].r + 1); }
相关文章推荐
- Django中的Form(二)
- List of algorithms:算法大全
- Google 的开源技术protobuf 简介与例子
- going deeper with convolution---googlenet
- Go语言核心之美 2.6-常量
- STL algorithm
- GOOGLE PLAY转移已发布的应用到另一开发者账号
- Django--form保存用户输入内容
- Django--static静态文件引用
- 安装diango
- Go语言配置文件解析器,类似于Windows下的INI文件.
- Django中静态文件引用优化
- win7下无法创建django工程
- Google 网上论坛(Google Online Forums)
- 基于django写的一个blog系统
- 【Django】 gunicorn部署纪要
- 【Django】 gunicorn部署纪要
- google protobuf安装与使用
- mogondb安装常识
- Django修改admin后台管理表单