제출 #1243846

#제출 시각아이디문제언어결과실행 시간메모리
1243846wedonttalkanymoreGlobal Warming (CEOI18_glo)C++20
100 / 100
288 ms131600 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int long long #define pii pair<ll, ll> #define fi first #define se second const ll N = 2e5 + 5, inf = 1e18, mod = 1e9 + 7, block = 320; int dp[N][2]; int n, x; int a[N]; struct ST { struct item { pii val; item *left = nullptr; item *right = nullptr; }; item *root = nullptr; int L, R; ST(int l, int r) { L = l, R = r; root = new item(); } void update(item *&i, int l, int r, int pos, pii val) { if (!i) i = new item(); if (l == r) { i->val.fi = max(i->val.fi, val.fi); i->val.se = max(i->val.se, val.se); return; } int mid = (l + r) / 2; if (pos <= mid) update(i->left, l, mid, pos, val); else update(i->right, mid + 1, r, pos, val); pii left_val = i->left ? i->left->val : make_pair(0LL, 0LL); pii right_val = i->right ? i->right->val : make_pair(0LL, 0LL); i->val.fi = max(left_val.fi, right_val.fi); i->val.se = max(left_val.se, right_val.se); } pii get(item *i, int l, int r, int u, int v) { if (u > r || v < l || !i) return make_pair(0, 0); if (u <= l && r <= v) return i->val; int mid = (l + r) / 2; pii res; pii L = get(i->left, l, mid, u, v); pii R = get(i->right, mid + 1, r, u, v); res.fi = max(L.fi, R.fi); res.se = max(L.se, R.se); return res; } void update(int pos, pii val) { update(root, L, R, pos, val); } pii get(int l, int r) { return get(root, L, R, l, r); } }; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> x; for (int i = 1; i <= n; i++) cin >> a[i]; ST st(0, 1e12); for (int i = 1; i <= n; i++) { dp[i][0] = 1; // for (int j = 1; j < i; j++) { // if (a[j] < a[i]) { // dp[i][0] = max(dp[i][0], dp[j][0] + 1); // dp[i][1] = max(dp[i][1], dp[j][1] + 1); // } // } auto tmp = st.get(0, a[i] - 1); dp[i][0] = max(dp[i][0], tmp.fi + 1); dp[i][1] = max(dp[i][1], tmp.se + 1); int Left = max(0LL, a[i] - x - 1); int Right = a[i] + x - 1; // for (int j = 1; j < i; j++) { // if (Left <= a[j] && a[j] <= Right) { // dp[i][1] = max(dp[i][1], dp[j][0] + 1); // } // } tmp = st.get(Left, Right); dp[i][1] = max(dp[i][1], tmp.fi + 1); st.update(a[i], make_pair(dp[i][0], dp[i][1])); } int ans = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= 1; j++) ans = max(ans, dp[i][j]); } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...