A. k-Amazing Numbers
https://codeforces.com/problemset/problem/1416/A
题意:给定长度为n的数组a,现有k∈[1, n],求每个k值下,a中的amazing number。如果一个数在a的n - k + 1个连续区间中都出现,那么数值最小的数,就是amazing number。
思路:求出a中的每个数字,可以负责的最大k,那么从k,k+1,...,n都是使用这个数字作为最小值。只要求出每个数字距离最左边,上个数,下个数以及距离最右边距离中的最大一个,就得到了合法的k值。 首先遍历所有的数字,维护last数组和f数组,last代表数字上一次出现的位置,f代表当前数字可以代表的最小合法区间长度。最后,遍历[1, n],按条件更新ans数组即可。
总结:。。好凌乱
inline void solve() {
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
vector<int> f(n + 1, 0);
vector<int> ans(n + 1, -1);
vector<int> last(n + 1, 0);
for (int i = 1; i <= n; ++i) {
f[a[i]] = max(f[a[i]], i - last[a[i]]);
last[a[i]] = i;
}
for (int i = 1; i <= n; ++i) {
f[i] = max(f[i], n - last[i] + 1);
}
for (int i = 1; i <= n; ++i) {
int l = f[i];
while (l <= n && ans[l] == -1) {
ans[l ++] = i;
}
}
for (int i = 1; i <= n; ++i) {
cout << ans[i] << " \n"[i == n];
}
}

浙公网安备 33010602011771号