제출 #1275438

#제출 시각아이디문제언어결과실행 시간메모리
1275438ezrapoGlobal Warming (CEOI18_glo)C++20
100 / 100
231 ms28764 KiB
#include <bits/stdc++.h> using namespace std; #define int long long struct Segtree { int n; vector<int> st; Segtree(int _n) { n=_n; st.resize(4*n+5); } int _query(int node, int l, int r, int ql, int qr) { if (r<ql || l>qr) return 0; if (ql<=l && r<=qr) return st[node]; int mid=(l+r)/2; return max(_query(node*2+1, l, mid, ql, qr), _query(node*2+2, mid+1, r, ql, qr)); } void _update(int node, int l, int r, int pos, int val) { if (l==r) {st[node]=max(st[node], val); return;} int mid=(l+r)/2; if (pos<=mid) _update(node*2+1, l, mid, pos, val); else _update(node*2+2, mid+1, r, pos, val); st[node]=max(st[node*2+1], st[node*2+2]); } int query(int l, int r) {return _query(0, 0, n-1, l, r);} void update(int pos, int val) {_update(0, 0, n-1, pos, val);} }; int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int n, x; cin >> n >> x; vector<int> a(n+1), ax(n+1); { vector<int> b; for (int i=1; i<=n; i++) cin >> a[i], ax[i] = a[i]+x; for (int i=1; i<=n; i++) b.push_back(a[i]), b.push_back(ax[i]); b.push_back(-1e18); sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); for (int i=1; i<=n; i++) a[i]=lower_bound(b.begin(), b.end(), a[i])-b.begin()+1; for (int i=1; i<=n; i++) ax[i]=lower_bound(b.begin(), b.end(), ax[i])-b.begin()+1; } Segtree dp0(2*n+10); Segtree dp1(2*n+10); for (int i=1; i<=n; i++) { dp1.update(ax[i], max(dp0.query(0, ax[i]-1)+1, dp1.query(0, ax[i]-1)+1)); dp0.update(a[i], dp0.query(0, a[i]-1)+1); } cout << dp1.st[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...