top1编程
← 返回题目
题解

数列

1 条题解

  • 0
    @ 2026-7-29 20:23:23
    #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