Advertisement
Guest User

Untitled

a guest
Nov 8th, 2014
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <string>
  5. #include <sstream>
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <iomanip>
  9. #include <map>
  10. #include <set>
  11. #include <list>
  12. #include <queue>
  13. #include <stack>
  14. #include <vector>
  15. #include <cassert>
  16.  
  17. using namespace std;
  18.  
  19. #define pb push_back
  20. #define mp make_pair
  21. #define REP(i, n) for (int i = 0; i < (int)(n); ++i)
  22. #define foreach(e, x) for (__typeof(x.begin()) e = x.begin(); e != x.end(); ++e)
  23. typedef long long LL;
  24. typedef pair<int, int> PII;
  25.  
  26. const int INF = 1e9;
  27.  
  28. int n;
  29. int a[100000], d[100000], ac = 0;
  30. int nx[100001], pre[100001];
  31. int tmp;
  32. bool fin[100000];
  33. vector<int> ans;
  34. vector<int> pos[100001];
  35. vector<int> dd[100001];
  36. bool can[100001];
  37. int cnt[100001] = {};
  38. map<int, int> ma[100001];
  39. int mx[100001], mx2[100001];
  40.  
  41. bool check(int v, int noteq) {
  42.     for (int j : pos[v]) if (j != noteq && nx[v] == a[j + 1])
  43.         return true;
  44.     return false;
  45. }
  46.  
  47. int main() {
  48.     ios_base::sync_with_stdio(false);
  49.     cin >> n;
  50.     int x, y = -1;
  51.     REP(i, n) {
  52.         cin >> x;
  53.         if (x == y) ++d[ac - 1];
  54.         else {
  55.             a[ac] = x;
  56.             d[ac++] = 1;
  57.         }
  58.         y = x;
  59.     }
  60.     n = ac;
  61.     REP(i, n) ++cnt[a[i]];
  62.     tmp = INF;
  63.     for (int i = 100000; i >= 1; --i) {
  64.         nx[i] = tmp;
  65.         if (cnt[i]) tmp = i;
  66.     }
  67.     tmp = INF;
  68.     for (int i = 1; i <= 100000; ++i) {
  69.         pre[i] = tmp;
  70.         if (cnt[i]) tmp = i;
  71.     }
  72.     REP(i, n - 1) if (nx[a[i]] == a[i + 1]) {
  73.         pos[a[i]].pb(i);
  74.     }
  75.  
  76.     REP(i, n) fin[i] = true;
  77.     for (int i = 1; i <= 100000; ++i)
  78.         dd[i].assign((int)pos[i].size(), 0);
  79.     for (int i = 100000; i >= 1; --i) if (cnt[i]) {
  80.         REP(j, pos[i].size()) {
  81.             int jj = pos[i][j];
  82.             if (nx[i] == INF || cnt[nx[i]] == 1) {
  83.                 dd[i][j] = 1;
  84.                 continue;
  85.             }
  86.             int m = mx[nx[i]];
  87.             if (ma[nx[i]][jj + 1] == m)
  88.                 m = mx2[nx[i]];
  89.             dd[i][j] = m + 1;
  90.         }
  91.         mx[i] = mx2[i] = 0;
  92.         REP(j, pos[i].size()) if (dd[i][j] > mx[i]) {
  93.             mx2[i] = mx[i];
  94.             mx[i] = dd[i][j];
  95.         } else {
  96.             mx2[i] = max(mx2[i], dd[i][j]);
  97.         }
  98.         REP(j, pos[i].size()) ma[i][pos[i][j]] = dd[i][j];
  99.     }
  100.     REP(i, n) can[i] = true;
  101.     for (int i = 1; i <= 100000; ++i) if (cnt[i]) {
  102.         int best = -1, bestj = -1;
  103.         REP(j, pos[i].size()) {
  104.             int jj = pos[i][j];
  105.             if (can[jj] && best < dd[i][j]) {
  106.                 best = dd[i][j];
  107.                 bestj = jj;
  108.             }
  109.         }
  110.         if (bestj != -1) {
  111.             if (nx[i] && cnt[nx[i]] > 1)
  112.                 can[bestj + 1] = false;
  113.             fin[bestj] = false;
  114.         }
  115.     }
  116.  
  117.     int tot = 0;
  118.     REP(i, n) {
  119.         tot += d[i];
  120.         if (fin[i]) {
  121.             ans.pb(tot);
  122.             tot = 0;
  123.         }
  124.     }
  125.     cout << (int)ans.size() << '\n';
  126.     REP(i, ans.size()) cout << ans[i] << ' ';
  127.     cout << '\n';
  128.     return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement