Submission #1186973

#TimeUsernameProblemLanguageResultExecution timeMemory
1186973Born_To_LaughGlobal Warming (CEOI18_glo)C++17
100 / 100
297 ms28580 KiB
// Born_To_Laugh - Hughie Do #include <bits/stdc++.h> #define alle(sth) sth.begin(), sth.end() using namespace std; typedef long long ll; [[maybe_unused]] const ll MOD = 998244353, INF = 1e9 + 7; #define int ll struct Segment_Tree { int n; vector<int> st; Segment_Tree(int _n): n(_n), st(4*n, 0) {} void update(int id, int l, int r, int pos, int val) { if (l > pos || r < pos) return; if (l == r) { st[id] = max(st[id], val); return; } int mid = (l + r) >> 1; update(id<<1, l, mid, pos, val); update(id<<1|1, mid+1, r, pos, val); st[id] = max(st[id<<1], st[id<<1|1]); } int get(int id, int l, int r, int u, int v) { if (r < u || l > v) return -INF; if (u <= l && r <= v) return st[id]; int mid = (l + r) >> 1; return max(get(id<<1, l, mid, u, v), get(id<<1|1, mid+1, r, u, v)); } void update(int pos, int val) { update(1,1,n,pos,val); } int get(int l, int r) { return get(1,1,n,l,r); } }; void solve() { int n, x; cin >> n >> x; vector<int> a(n+1); for (int i = 1; i <= n; ++i) cin >> a[i]; vector<int> temp; for (int i = 1; i <= n; ++i) { temp.push_back(a[i] + 1); temp.push_back(a[i] + 1 - x); temp.push_back(a[i]); } temp.push_back(INF); sort(temp.begin(), temp.end()); temp.erase(unique(temp.begin(), temp.end()), temp.end()); auto get_pos = [&](int v) { return int(upper_bound(temp.begin(), temp.end(), v) - temp.begin()) + 1; }; vector<int> dp; vector<int> lis(n+10, 0); for (int i = 1; i <= n; ++i) { int pos = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin(); if (pos == (int)dp.size()) dp.push_back(a[i]); else dp[pos] = a[i]; lis[i] = pos + 1; } Segment_Tree seg(temp.size() + 10); vector<int> suff(n+10); int INFpos = get_pos(INF); for (int i = n; i >= 1; --i) { suff[i] = seg.get(get_pos(a[i] + 1 - x), INFpos); seg.update(get_pos(a[i]), seg.get(get_pos(a[i] + 1), INFpos) + 1); } int ans = 0; for (int i = 1; i <= n; ++i) { ans = max(ans, lis[i] + suff[i]); } cout << ans << '\n'; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); 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...