A. Meximum Array
https://codeforces.com/contest/1628/problem/A
题意:给定长度为n的数组,每次操作任选长度为k的前缀,将该前缀中的MEX值放入新数组中,题目要求新数组lexicographically maximum。
思路:对于每次操作,查询当前数组中第一个不出现的数字(用map来维护),并确定使用这个数字要丢弃的前缀长度(用一个下标维护即可,当数字被查询到不存在时,前面使用的数字中,出现位置最靠后的位置,就是本次操作的前缀的最后一个数组下标,对于0不存在时,要特殊处理一下)
总结:第一次看想到了暴力,也想到了快速的查询第一个不出现的数字,也想到了找到数字后,要将之前所有不存在的数字移除,但是时间复杂度估计错了,估计成了n²,所以就没有写。。
inline void solve() {
	int n;
	cin >> n;
	map<int, set<int>> mapp;
	for (int i = 0; i < n; ++i) {
		int t;
		cin >> t;
		mapp[t].insert(i);
	}
	vector<int> ans;
	int p = 0;
	while (p < n) {
		int q = 0;
		int newP = p;
		for (int i = 0; i <= n; ++i) {
			while (!mapp[i].empty() && *mapp[i].begin() < p) {
				mapp[i].erase(mapp[i].begin());
			} 
			if (mapp[i].empty()) {
				q = i;
				if (!i) {
					p ++;
				}
				break;
			}
			newP = max(newP, *mapp[i].begin());
		}
		ans.push_back(q);
		p = newP + 1;
	}
	int m = (int)ans.size();
	cout << m << "\n";
	for (int i = 0; i < m; ++i) {
		cout << ans[i] << " \n"[i == m - 1];
	}
}
                    
                
                
            
        
浙公网安备 33010602011771号