Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <string>
- #include <sstream>
- #include <algorithm>
- #include <iostream>
- #include <iomanip>
- #include <map>
- #include <set>
- #include <list>
- #include <queue>
- #include <stack>
- #include <vector>
- #include <cassert>
- using namespace std;
- #define pb push_back
- #define mp make_pair
- #define REP(i, n) for (int i = 0; i < (int)(n); ++i)
- #define foreach(e, x) for (__typeof(x.begin()) e = x.begin(); e != x.end(); ++e)
- typedef long long LL;
- typedef pair<int, int> PII;
- const int INF = 1e9;
- int n;
- int a[100000], d[100000], ac = 0;
- int nx[100001], pre[100001];
- int tmp;
- bool fin[100000];
- vector<int> ans;
- vector<int> pos[100001];
- vector<int> dd[100001];
- bool can[100001];
- int cnt[100001] = {};
- map<int, int> ma[100001];
- int mx[100001], mx2[100001];
- bool check(int v, int noteq) {
- for (int j : pos[v]) if (j != noteq && nx[v] == a[j + 1])
- return true;
- return false;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin >> n;
- int x, y = -1;
- REP(i, n) {
- cin >> x;
- if (x == y) ++d[ac - 1];
- else {
- a[ac] = x;
- d[ac++] = 1;
- }
- y = x;
- }
- n = ac;
- REP(i, n) ++cnt[a[i]];
- tmp = INF;
- for (int i = 100000; i >= 1; --i) {
- nx[i] = tmp;
- if (cnt[i]) tmp = i;
- }
- tmp = INF;
- for (int i = 1; i <= 100000; ++i) {
- pre[i] = tmp;
- if (cnt[i]) tmp = i;
- }
- REP(i, n - 1) if (nx[a[i]] == a[i + 1]) {
- pos[a[i]].pb(i);
- }
- REP(i, n) fin[i] = true;
- for (int i = 1; i <= 100000; ++i)
- dd[i].assign((int)pos[i].size(), 0);
- for (int i = 100000; i >= 1; --i) if (cnt[i]) {
- REP(j, pos[i].size()) {
- int jj = pos[i][j];
- if (nx[i] == INF || cnt[nx[i]] == 1) {
- dd[i][j] = 1;
- continue;
- }
- int m = mx[nx[i]];
- if (ma[nx[i]][jj + 1] == m)
- m = mx2[nx[i]];
- dd[i][j] = m + 1;
- }
- mx[i] = mx2[i] = 0;
- REP(j, pos[i].size()) if (dd[i][j] > mx[i]) {
- mx2[i] = mx[i];
- mx[i] = dd[i][j];
- } else {
- mx2[i] = max(mx2[i], dd[i][j]);
- }
- REP(j, pos[i].size()) ma[i][pos[i][j]] = dd[i][j];
- }
- REP(i, n) can[i] = true;
- for (int i = 1; i <= 100000; ++i) if (cnt[i]) {
- int best = -1, bestj = -1;
- REP(j, pos[i].size()) {
- int jj = pos[i][j];
- if (can[jj] && best < dd[i][j]) {
- best = dd[i][j];
- bestj = jj;
- }
- }
- if (bestj != -1) {
- if (nx[i] && cnt[nx[i]] > 1)
- can[bestj + 1] = false;
- fin[bestj] = false;
- }
- }
- int tot = 0;
- REP(i, n) {
- tot += d[i];
- if (fin[i]) {
- ans.pb(tot);
- tot = 0;
- }
- }
- cout << (int)ans.size() << '\n';
- REP(i, ans.size()) cout << ans[i] << ' ';
- cout << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement