题解
数列
1 条题解
-
0
#include<bits/stdc++.h> using namespace std; /* 整个数列我们一开始都假设为左半部分 */ int n; int s[300005];//初始数列 int a[300005], b[300005];//a是左半部分的桶,b右半部分的桶 int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; a[s[i]]++;//统计每个数出现的次数,先全部放在a桶,表示左半部分 } int numa = 0, numb = 0;//表示左右两半不同数的个数 for (int i = 1; i <= 300000; i++) { if (a[i] != 0) { numa++;//左半部分不同数的个数 } } int ans = numa; //开始从右往左扫描,将扫描到的数一个个划分到右半部分 for (int i = n; i >= 1; i--) { a[s[i]]--; b[s[i]]++; if (a[s[i]] == 0) {//减少到0,说明左边少一个不同的数 numa--; } if (b[s[i]] == 1) {//增加后为1,说明右边增加一个不同的数 numb++; } //判断一下当前不同的个数变化后的和是不是最大的 ans = max(ans, numa + numb); } cout << ans; return 0; }
- 1