题意:
给定长度为n的序列,找一个最长的区间,使得其中不同的数字的个数不大于K
思路:
尺取
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define kuaidian ios::sync_with_stdio(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 7, maxd = 1e8;
const ll mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int n, k;
int a[maxn], cnt[maxn] = {0};
int main() {
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
int l_ = 1, r_ = 1, t = 1, ans = k, id = 1;
cnt[a[1]]++;
while(1) {
if(r_ < n && t <= k) {
r_++;
if(cnt[a[r_]] == 0)
t++;
cnt[a[r_]]++;
if(t <= k) {
if(ans < (r_-l_+1)) {
ans = (r_-l_+1);
id = l_;
}
}
} else if(t > k) {
cnt[a[l_]]--;
if(cnt[a[l_]] == 0) t--;
l_++;
if(ans < (r_-l_+1)) {
ans = (r_-l_+1);
id = l_;
}
} else break;
}
printf("%d %d", id, id+ans-1);
return 0;
}