奥赛一本通 1464 收集雪花

1464 收集雪花

题目大意

在一个序列中选择没有重复元素的子段,求这个子段的最大长度。

知识要点

离散化、双指针

解题思路

对于每个合法子段的左右端点,显然左端点随右端点单调递增,可以利用双指针维护。将输入数据离散化后可以方便记录每个元素上一次出现的位置,以此更新合法子段的左端点。

参考代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;
int a[N], b[N];
int main() {
    int n, ans = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);

    memcpy(b, a, sizeof(a));
    sort(b, b + n); //离散化
    for(int i = 0; i < n; i++) a[i] = lower_bound(b, b + n, a[i]) - b;

    memset(b, -1, sizeof(b)); //上一次出现的位置
    for(int l = -1, r = 0; r < n; r++) { //枚举右端点
        l = max(l, b[a[r]]);
        ans = max(ans, r - l);
        b[a[r]] = r; //更新上一次出现的位置
    }
    printf("%d\n", ans);
    return 0;
}
posted @ 2026-09-23 09:47  萧西待水  阅读(8)  评论(0)    收藏  举报