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...