제출 #1162900

#제출 시각아이디문제언어결과실행 시간메모리
1162900aroradevGlobal Warming (CEOI18_glo)C++20
100 / 100
152 ms7600 KiB
#include <bits/stdc++.h> #define sz(a) ((int)((a).size())) typedef long long ll; typedef long double ld; using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; const int MAX_N = 2e5 + 10; int a[MAX_N]; int lis[MAX_N]; void solve() { int n, x; cin >> n >> x; for (int i = 0; i < n; i++) cin >> a[i]; int ans = 0; for (int rep = 0; rep < 2; rep++) { Tree<int> s; s.insert(a[n - 1]); lis[n - 1] = 1; for (int i = n - 2; i >= 0; i--) { auto it = s.upper_bound(a[i]); if (it == s.begin()) { s.insert(a[i]); } else { it--; s.erase(it); s.insert(a[i]); } lis[i] = sz(s) - s.order_of_key(a[i]); ans = max(ans, lis[i]); } vector<int> dp = {a[0]}; for (int i = 1; i < n; i++) { int pos = lower_bound(dp.begin(), dp.end(), a[i] + x) - dp.begin(); ans = max(ans, pos + lis[i]); pos = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin(); if (pos == sz(dp)) dp.push_back(a[i]); else dp[pos] = a[i]; } reverse(a, a + n); for (int i = 0; i < n; i++) a[i] = -a[i]; } cout << ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; while (t--) solve(); }
#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...