专栏文章
题解:AT_abc397_c [ABC397C] Variety Split Easy
AT_abc397_c题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipwm0w6
- 此快照首次捕获于
- 2025/12/03 19:08 3 个月前
- 此快照最后确认于
- 2025/12/03 19:08 3 个月前
题目大意:
有 个数,将这 个数分成两段连续的子序列,求这两个子序列中不同元素数量的最大值。
因为是求不同元素的数量,所以我们要去重。而众所周知, 有一个叫 的东西,能自动去重。但是,我们不能把整个数列一起塞进 里,因为两个子序列中可能分别有两个相同的数,要算入各自的答案里。于是,易想到开两个 。一个存左子序列的答案,一个存右子序列的答案。最后把 到 的左右答案加起来求 就可以了。
代码如下:
CPP#include <bits/stdc++.h>
using namespace std;
int n;
int a[300010];
int l[300010], r[300010];
set<int> sl, sr;
int main(){
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++){
sl.insert(a[i]);
l[i] = sl.size();
}
for (int i = n; i >= 1; i--){//注意要从大到小循环
sr.insert(a[i]);
r[i] = sr.size();
}
int ans = 0;
for (int i = 1; i < n; i++){
int sum = l[i] + r[i + 1];//左答案是1 -- i,右答案是i + 1 -- n
ans = max(ans, sum);
}
cout << ans;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...