#include <bits/stdc++.h>
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
constexpr int MAX = 2e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31;
int compress(vector <int> &v) {
int n = v.size();
vector <pair<int, int>> x;
for (int i=0; i < n; i++) x.pb({v[i], i});
sort(all(x));
int nxt=1;
for (int i=0; i < n-1; i++) {
if (x[i].ff == x[i+1].ff) x[i].ff = nxt;
else x[i].ff = nxt++;
}
x.back().ff = nxt;
for (auto &i : x) v[i.ss] = i.ff;
return nxt;
}
struct SegTree{
int n;
vector <int> a, t;
void init(int n1) {
n = n1;
t.assign(4*(n+2), INF);
}
int merge(int a, int b) {
return min(a, b); // TODO
}
int find(int v, int tl, int tr, int l, int r) {
if (l > r) return INF; // TODO
if (tl == l && tr == r) return t[v];
int tm = (tl + tr) / 2;
int r1 = find(v*2, tl, tm, l, min(r, tm));
int r2 = find(v*2+1, tm+1, tr, max(l, tm+1), r);
return merge(r1, r2);
}
void update(int v, int tl, int tr, int i, int x) {
if (tl == tr) {
t[v] = x;
return;
}
int tm = (tl + tr) / 2;
if (i <= tm) update(v*2, tl, tm, i, x);
else update(v*2+1, tm+1, tr, i, x);
t[v] = merge(t[v*2], t[v*2+1]);
}
int get(int l, int r) {
return find(1, 0, n-1, l, r);
}
void upd(int i, int x) {
update(1, 0, n-1, i, x);
}
};
void _() {
int n;
cin >> n;
vector <int> v(n);
for (int &i : v) cin >> i;
compress(v);
// for (int &i : v) cerr << i << ' ';
SegTree t;
t.init(n+1);
for (int i=0; i < n; i++) {
t.upd(v[i], i);
}
vector <int> dp(n, INF);
dp[0] = 1;
for (int i = 1; i < n; i++) {
dp[i] = dp[i-1] + 1;
for (int j = i-1; j >= 0; j--) {
if (v[j] <= v[j+1] && t.get(v[j]+1, v[i]-1) > i) {
// if (j == 1 && i == 2) cout << 'a';
dp[i] = min(dp[i], (j == 0 ? 0 : dp[j-1]) + 1);
}
else break;
}
}
// cerr << endl;
// for (int &i : dp) cerr << i << ' ';
cout << dp[n-1];
}
signed main() {
GOOD_LUCK
int tests=1;
// cin >> tests;
for (int i=1; i <= tests; i++) {
_();
cout << endl;
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |