博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Longest k-Good Segment CodeForces - 616D ( 尺取法)
阅读量:4046 次
发布时间:2019-05-25

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

 

The array a with n integers is given. Let's call the sequence of one or more consecutive elements in a segment. Also let's call the segment k-good if it contains no more than k different values.

Find any longest k-good segment.

As the input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printf instead of cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.

Input

The first line contains two integers n, k (1 ≤ k ≤ n ≤ 5·105) — the number of elements in a and the parameter k.

The second line contains n integers ai (0 ≤ ai ≤ 106) — the elements of the array a.

Output

Print two integers l, r (1 ≤ l ≤ r ≤ n) — the index of the left and the index of the right ends of some k-good longest segment. If there are several longest segments you can print any of them. The elements in a are numbered from 1 to n from left to right.

Examples

Input

5 5
1 2 3 4 5                                                                                                                                                                                                                                                      

Output

1 5                                                                                                                                                                                                                                                      

Input

9 3
6 5 1 2 3 2 1 4 5                                                                                                                                                                                                                                                                                                

Output

3 7                                                                                                                                                                                                                                                                                                

Input

3 1

1 2 3

Output

1 1                                                                                                                                                                                                                                                                                                                                        

题意:

给出n个数的数组,从数组中找到一个最长子串,子串中只能有k个不同的数字,输出子串的第一个元素的下标和最后一个元素的下标。数组n的下标从1开始计数。 

代码:

#include
#include
#include
#include
using namespace std;int vis[6000007]; //vis数组来标记这个数字是否出现过 int a[600007];int main(){ int n, k; scanf("%d%d", &n, &k); for(int i = 1; i <= n; ++ i) { scanf("%d", &a[i]); } memset(vis,0,sizeof(vis)); int l=1,r=1;//存放最终子串的左边界和右边界 int num=0;//存放子串中不同的数的个数 int ll=1;//代表左指针 for(int i=1;i<=n;i++) //i来代表右指针 { if(vis[a[i]]==0) //如果这个数没出现过 { vis[a[i]]++; num++; } else //这个数字已经存在过 { vis[a[i]]++; } while(num>k) //如果不相同的数的个数大于k { vis[a[ll]]--; //左指针就要向右移动,直到num≤k if(vis[a[ll]]==0) num--; ll++; } if((i-ll+1)>(r-l+1)) //不断更新子串中的数字个数 { r=i; l=ll; } } printf("%d %d\n",l,r); return 0; }

 

转载地址:http://jvzci.baihongyu.com/

你可能感兴趣的文章
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>