Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <string>
- #include <math.h>
- #include <climits>
- #include <list>
- #include <map>
- #include <set>
- #include <queue>
- #include <unordered_map>
- #include <unordered_set>
- #include <map>
- #include <numeric>
- #include <functional>
- //#include <chrono>
- //#include <fstream>
- //#include <bits/stdc++.h>
- #define mp make_pair
- #define pb push_back
- #define eb emplace_back
- #define x first
- #define y second
- #define sz(x) (int)x.size()
- #define all(x) begin(x), end(x)
- #define rall(x) rbegin(x), rend(x)
- #define FOR(i,a,b) for (int i = (a); i < (b); i++)
- #define RFOR(i,b,a) for (int i = (b) - 1; i >= (a); i--)
- using namespace std;
- typedef unsigned long long ull;
- typedef long long ll;
- typedef long double ld;
- typedef pair<int, int> pi;
- typedef pair<ll, ll> pl;
- typedef vector<int> veci;
- typedef vector<bool> vecb;
- typedef vector<vector<int>> vvi;
- typedef vector<vector<bool>> vvb;
- const int INF_I = 1e9;
- const ll INF_LL = 1e18;
- int main() {
- /*ifstream cin("in.txt");
- ofstream cout("out.txt");
- auto start_time = chrono::high_resolution_clock::now();*/
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int n;
- cin >> n;
- vvb del(n, vecb(n, false));
- vvi last_del(n, veci(n, -1));
- veci a(n);
- for (int i = 0; i < n; i++)
- cin >> a[i];
- for (int i = 0; i < n-1; i++) {
- del[i][i] = true;
- del[i][i + 1] = true;
- }
- del[n - 1][n - 1] = true;
- for (int len = 1; len < n; len++)
- for (int beg = 0; beg < n - len; beg++)
- for (int k = beg + 1; k < beg + len; k++)
- if (del[beg][k] && del[k][beg + len] &&
- (a[k] > a[beg] && a[k] > a[beg + len] || a[k] < a[beg] && a[k] < a[beg + len])) {
- last_del[beg][beg + len] = k;
- del[beg][beg + len] = true;
- break;
- }
- veci dp(n, 1);
- veci p(n, -1);
- for (int i = 1; i < n; i++) {
- for (int j = 0; j < i; j++) {
- if (dp[j] == 1 && j != 0) {
- continue;
- }
- if (a[i] >= a[j] && dp[j] + 1 > dp[i] && del[j][i] ) {
- dp[i] = dp[j] + 1;
- p[i] = j;
- }
- }
- }
- int cur = n-1;
- if (dp[cur] == 1) {
- cout << "-1\n";
- return 0;
- }
- cout << n - dp[cur] << "\n";
- function<void(int, int)> print = [&](int l, int r) {
- if (l < 0 || r > n || last_del[l][r] == -1)
- return;
- print(l, last_del[l][r]);
- print(last_del[l][r], r);
- cout << last_del[l][r] + 1 << "\n";
- };
- while (cur != -1) {
- print(p[cur], cur);
- cur = p[cur];
- }
- /*auto end_time = chrono::high_resolution_clock::now();
- chrono::duration<double> duration = end_time - start_time;
- cout << duration.count() << "\n";
- cin.close();
- cout.close();*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment