int n, m, b; int a[kMaxN], unq[kMaxN], pos[kMaxN], res[kMaxN], sum[kMaxN]; std::vector<int> v[kMaxN];
voiddiscrete(){ b = sqrt(n); for (int i = 1; i <= n; ++i) unq[i] = a[i]; std::sort(unq + 1, unq + 1 + n); m = std::unique(unq + 1, unq + 1 + n) - (unq + 1); for (int i = 1; i <= n; ++i) v[i].clear(), res[i] = 0; for (int i = 1; i <= n; ++i) { a[i] = std::lower_bound(unq + 1, unq + 1 + m, a[i]) - unq; pos[i] = v[a[i]].size(); v[a[i]].emplace_back(i); } }
intbig1(int x, int y){ // xxxxxyyyyyyyyyxxxxx staticint pre1[kMaxN], pre2[kMaxN]; int mi = 1e9, ret = 0; for (int i = 0; i < (int)v[y].size(); ++i) { pre1[i] = sum[v[y][i]] + i + 1; pre2[i] = sum[v[y][i] - 1] + i; mi = std::min(mi, pre2[i]); ret = std::max(ret, pre1[i] - mi); } return ret + v[x].size(); }
intbig2(int x, int y){ // yyyyyxxxxxxyyyyyy staticint pre[kMaxN], suf[kMaxN], mx[kMaxN]; for (int i = 0; i < (int)v[y].size(); ++i) { pre[i] = sum[v[y][i]] + i + 1; suf[i] = sum[n] - sum[v[y][i] - 1] + v[y].size() - i; mx[i] = (i == 0 ? pre[i] : std::max(mx[i - 1], pre[i])); } int now = -1e9, ret = mx[(int)v[y].size() - 1]; for (int i = (int)v[y].size() - 1; i; --i) { now = std::max(now, suf[i]); ret = std::max(ret, now + pre[i - 1]); } ret = std::max(ret, now); return ret + v[x].size(); }
voidsolve_big(){ for (int x = 1; x <= m; ++x) { if (v[x].size() <= b) continue; for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] - (a[i] == x); for (int y = 1; y <= m; ++y) { res[x] = std::max(res[x], big1(x, y)); res[y] = std::max(res[y], big2(x, y)); } } }
voidsolve_small(){ staticint c[kMaxN], cnt[kMaxN]; // c[i] : [i, r] 的众数 std::fill_n(c + 1, n, 0); std::fill_n(cnt + 1, n, 0); for (int i = 1; i <= n; ++i) { if (v[a[i]].size() > b) continue; res[a[i]] = std::max(res[a[i]], c[1] + (int)v[a[i]].size() - pos[i]); for (int j = pos[i] - 1; ~j; --j) { res[a[i]] = std::max(res[a[i]], c[v[a[i]][j] + 1] + (int)v[a[i]].size() - pos[i] + j + 1); } for (int j = pos[i]; ~j; --j) { for (int k = v[a[i]][j]; k && c[k] <= pos[i] - j + 1; --k) c[k] = pos[i] - j + 1; } } int mx = 0; for (int i = n; i; --i) { res[a[i]] = std::max(res[a[i]], mx + pos[i] + 1); mx = std::max(mx, ++cnt[a[i]]); } }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i]; discrete(), solve_big(), solve_small(); int mx = 0; for (int i = 1; i <= m; ++i) mx = std::max(mx, res[i]); std::cout << mx << '\n'; for (int i = 1; i <= m; ++i) if (res[i] == mx) std::cout << unq[i] << '\n'; }