奥赛一本通 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;
}

浙公网安备 33010602011771号