Raslboyy

111485

Dec 15th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string>
  5. #include <math.h>
  6. #include <climits>
  7.  
  8. #include <list>
  9. #include <map>
  10. #include <set>
  11. #include <queue>
  12. #include <unordered_map>
  13. #include <unordered_set>
  14. #include <map>
  15. #include <numeric>
  16. #include <functional>
  17.  
  18. //#include <chrono>
  19. //#include <fstream>
  20. //#include <bits/stdc++.h>
  21.  
  22. #define mp make_pair
  23. #define pb push_back
  24. #define eb emplace_back
  25. #define x first
  26. #define y second
  27. #define sz(x) (int)x.size()
  28. #define all(x) begin(x), end(x)
  29. #define rall(x) rbegin(x), rend(x)
  30. #define FOR(i,a,b) for (int i = (a); i < (b); i++)
  31. #define RFOR(i,b,a) for (int i = (b) - 1; i >= (a); i--)
  32.  
  33. using namespace std;
  34.  
  35. typedef unsigned long long ull;
  36. typedef long long ll;
  37. typedef long double ld;
  38. typedef pair<int, int> pi;
  39. typedef pair<ll, ll> pl;
  40. typedef vector<int> veci;
  41. typedef vector<bool> vecb;
  42. typedef vector<vector<int>> vvi;
  43. typedef vector<vector<bool>> vvb;
  44.  
  45. const int INF_I = 1e9;
  46. const ll INF_LL = 1e18;
  47.  
  48. int main() {
  49.     /*ifstream cin("in.txt");
  50.     ofstream cout("out.txt");
  51.     auto start_time = chrono::high_resolution_clock::now();*/
  52.  
  53.     ios::sync_with_stdio(false);
  54.     cin.tie(0);
  55.     cout.tie(0);
  56.  
  57.    
  58.     int n;
  59.     cin >> n;
  60.     vvb del(n, vecb(n, false));
  61.     vvi last_del(n, veci(n, -1));
  62.     veci a(n);
  63.     for (int i = 0; i < n; i++)
  64.         cin >> a[i];
  65.     for (int i = 0; i < n-1; i++) {
  66.         del[i][i] = true;
  67.         del[i][i + 1] = true;
  68.     }
  69.     del[n - 1][n - 1] = true;
  70.        
  71.     for (int len = 1; len < n; len++)
  72.         for (int beg = 0; beg < n - len; beg++)
  73.             for (int k = beg + 1; k < beg + len; k++)
  74.                 if (del[beg][k] && del[k][beg + len] &&
  75.                     (a[k] > a[beg] && a[k] > a[beg + len] || a[k] < a[beg] && a[k] < a[beg + len])) {
  76.                     last_del[beg][beg + len] = k;
  77.                     del[beg][beg + len] = true;
  78.                     break;
  79.                 }
  80.    
  81.     veci dp(n, 1);
  82.     veci p(n, -1);
  83.     for (int i = 1; i < n; i++) {
  84.         for (int j = 0; j < i; j++) {
  85.             if (dp[j] == 1 && j != 0) {
  86.                 continue;
  87.             }
  88.             if (a[i] >= a[j] && dp[j] + 1 > dp[i] && del[j][i] ) {
  89.                 dp[i] = dp[j] + 1;
  90.                 p[i] = j;
  91.             }
  92.         }
  93.     }
  94.  
  95.     int cur = n-1;
  96.     if (dp[cur] == 1) {
  97.         cout << "-1\n";
  98.         return 0;
  99.     }
  100.     cout << n - dp[cur] << "\n";
  101.  
  102.     function<void(int, int)> print = [&](int l, int r) {
  103.         if (l < 0 || r > n || last_del[l][r] == -1)
  104.             return;
  105.         print(l, last_del[l][r]);
  106.         print(last_del[l][r], r);
  107.         cout << last_del[l][r] + 1 << "\n";
  108.     };
  109.  
  110.     while (cur != -1) {
  111.         print(p[cur], cur);
  112.         cur = p[cur];
  113.     }
  114.  
  115.     /*auto end_time = chrono::high_resolution_clock::now();
  116.     chrono::duration<double> duration = end_time - start_time;
  117.     cout << duration.count() << "\n";
  118.     cin.close();
  119.     cout.close();*/
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment