CodeForces

来源:互联网 发布:微信看不到淘宝链接 编辑:程序博客网 时间:2024/05/18 01:14

题意:

给定长度为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;}


原创粉丝点击