Submission #1326540

#TimeUsernameProblemLanguageResultExecution timeMemory
1326540rayxuGlobal Warming (CEOI18_glo)C++20
100 / 100
176 ms47416 KiB
#include <bits/stdc++.h> #define int long long using namespace std; class SegTree { private: int sz; vector<int> tree; public: SegTree(int len):sz(len),tree(4*len,0){} void update(int ind,int val) { ind+=sz; tree[ind] = max(tree[ind],val); while (ind>1) { ind>>=1; tree[ind] = max(tree[ind*2],tree[ind*2+1]); } } int query(int l,int r) { l+=sz; r+=sz; int res=0; while (l<=r) { if (l&1) res = max(res,tree[l++]); if (!(r&1)) res = max(res,tree[r--]); l>>=1; r>>=1; } return res; } } ; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); //freopen("warm.in","r",stdin); int n,x; cin>>n>>x; vector<pair<int,int>> a(n); vector<int> all; for (auto &i:a) { cin>>i.first; i.second = i.first+x; all.push_back(i.first); all.push_back(i.first+x); } sort(begin(all),end(all)); for (auto &i:a) { i.first = lower_bound(begin(all),end(all),i.first)-begin(all)+1; i.second = lower_bound(begin(all),end(all),i.second)-begin(all)+1; } vector<int> l(n); SegTree tem(2*n+1); for (int i=0;i<n;i++) { l[i] = tem.query(0,a[i].first-1)+1; tem.update(a[i].first,l[i]); } SegTree dp(2*n+1); int ans=0; vector<int> r(n); SegTree tem1(2*n+1); for (int i=(n-1);i>=0;i--) { r[i] = tem1.query(a[i].first+1,2*n)+1; tem1.update(a[i].first,r[i]); } for (int i=(n-1);i>=0;i--) { ans = max(ans,(dp.query(a[i].first+1,2*n)+l[i])); //cout<<a[i].first<<" "<<a[i].second<<" "<<dp.query(a[i].first+1,2*n)<<" "<<l[i]<<endl; dp.update(a[i].second,r[i]); } 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...