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号