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之间的数字是已经统计好了的,没必要重新判断,这样就可以累加到最后。
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 Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- codeforces 618C. Constellation
- Codeforces Round #349 (Div. 2) - C
- Codeforces Round #361 (Div. 2)
- 7.13Codeforces Round #360 (Div. 2)
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers
- codeforces 16 Problem E fish
- Codeforces Round332 部分题解
- CodeForces 603A_Alternative Thinking (DP)
- CodeForces 602B_Approximating a Constant Range_DP
- Codeforces round #247 for Div. 2
- Codeforces Round #246 (Div. 2)
- Codeforces Round #356 (Div. 2)