您的位置:首页 > 编程语言 > Go语言

Educational Codeforces Round 5 D. Longest k-Good Segment(双指针)

2016-07-20 16:19 369 查看
time limit per test

1 second

memory limit per test256 megabytes

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/printfinstead 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

意思是说给你一个数组,然后再给你一个K,让你求出一个区间,这个区间中不同的数字最多只有K种,并且是最长的一个。

用两个变量来表示左右区间,比如用l和r来代表左右区间,然后不断更新r,只有当满足条件了,才开始更新l,每次更新r的时候都要判断这个数字是否出现过,这个好办,只要用个标记数组标记就行,毕竟数字并不是很大,之所以只有在满足条件的时候才更新l,是因为如果只是改变l,那只会改变一个数字在区间中出现的次数,新的l到r之间的数字是已经统计好了的,没必要重新判断,这样就可以累加到最后。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#define maxn 500010
#define maxm 6000100
using namespace std;
int arr[maxn];
int f[maxm];
int n,k;
int main()
{
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)  scanf("%d",&arr[i]);
int l=0;
int r=0;
int kind=0;
int ans=0;
int nut=0;
int ansl=0;
int ansr=0;
while(r<n)
{
while(kind<k)
{
if(r<n)
{
if(!f[arr[r]]) kind++;
f[arr[r]]++;
r++;
}
else  break;
}
while(kind==k)
{
if(r<n&&f[arr[r]])
{
f[arr[r]]++;
r++;
}
else  break;
}
ans=r-l;
if(ans>nut)
{
ansl=l+1;
ansr=r;
nut=ans;
}
f[arr[l]]--;
if(f[arr[l]]==0)  kind--;
l++;
}
printf("%d %d\n",ansl,ansr);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces