Submission #1024108

#TimeUsernameProblemLanguageResultExecution timeMemory
1024108NValchanovGlobal Warming (CEOI18_glo)C++17
62 / 100
56 ms12992 KiB
#include <bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; const ll MAXN = 2e5 + 10; const ll MAXA = 4e18 + 10; const ll MAXX = 1e9 + 10; struct update { ll idx; ll val; ll old; update() { idx = 0; val = old = -1; } update(ll _idx, ll _val, ll _old) { idx = _idx; val = _val; old = _old; } }; ll n, x; ll a[MAXN]; vector < update > updates; ll lis[MAXN]; ll lis_suff[MAXN]; ll ans; void read() { cin >> n >> x; for(ll i = 0; i < n; i++) { cin >> a[i]; } } void find_lis_suff() { ll len = 1; lis_suff[0] = -MAXA; lis_suff[1] = -a[n - 1]; updates.push_back(update(1, a[n - 1], 0)); for(ll i = n - 2; i >= 0; i--) { ll j = lower_bound(lis_suff, lis_suff + len + 1, -a[i]) - lis_suff; updates.push_back(update(j, a[i], -lis_suff[j])); lis_suff[j] = -a[i]; len = max(len, j); } ans = len; /* for(update u : updates) { cout << "Change at position " << u.idx << " : from " << u.old << " to " << u.val << endl; cout << "idx : " << u.idx << endl; cout << "old : " << u.old << endl; cout << "val : " << u.val << endl; } */ for(ll i = 1; i <= n; i++) { lis_suff[i] *= -1; } } void rollback() { assert(!updates.empty()); update u = updates.back(); lis_suff[u.idx] = u.old; updates.pop_back(); } ll bs(ll k) { ll left = 0; ll right = ans + 1; ll mid; while(right - left > 1) { mid = left + (right - left) / 2; if(lis_suff[mid] != 0 && lis_suff[mid] > k) left = mid; else right = mid; } return left; } void check(ll len) { ll val = lis[len] - x; ll pos = bs(val); ans = max(ans, len + pos); } void print() { cout << "Reversed LIS : " << endl; for(ll i = 1; i <= n; i++) { cout << lis_suff[i] << " "; } cout << endl << endl; cout << "Normal LIS : " << endl; for(ll i = 1; i <= n; i++) { cout << lis[i] << " "; } cout << endl << endl; } void solve() { ll len = 1; lis[0] = -MAXA; lis[1] = a[0]; rollback(); /// print(); check(len); for(ll i = 1; i < n; i++) { ll j = lower_bound(lis, lis + len + 1, a[i]) - lis; lis[j] = a[i]; len = max(len, j); rollback(); ///print(); check(len); } ans = max(ans, len); /// cout << "Answer : " << ans << endl; cout << ans << endl; } int main() { ios_base :: sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); read(); find_lis_suff(); solve(); 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...