제출 #1166924

#제출 시각아이디문제언어결과실행 시간메모리
1166924raul2008487Global Warming (CEOI18_glo)C++20
100 / 100
1895 ms159472 KiB
#include <bits/stdc++.h>
#define ll int
#define pll pair<ll,ll>
#define pb push_back
#define eb emplace_back
#define vl vector<ll>
#define fi first
#define se second
#define in insert
#define mpr make_pair
#define lg(x) __lg(x)
#define bpc(x) __builtin_popcount(x)
#define all(v) v.begin(), v.end()
#define endl '\n'
using namespace std;
const int sz = 2e5 + 5;
const int mod = 998244353;
ll inf = 1e8;
ll dp[sz];
struct BIT{
    vl ft;
    ll n;
    void init(ll N){
        n = N + 10;
        ft.assign(n + 5, 0);
    }
    void add(ll pos, ll val){
        for(pos; pos <= n; pos += (pos & (-pos))){
            ft[pos] = max(ft[pos], val);
        }
    }
    ll get(ll pos){
        ll ans = 0;
        for(pos; pos > 0; pos -= (pos & (-pos))){
            ans = max(ans, ft[pos]);
        }
        return ans;
    }
};
struct BT{
    vector<multiset<ll>> ft;
    ll n;
    void init(ll N){
        n = N + 10; 
        multiset<ll> empt;
        empt.in(0);
        for(int i = 1; i <= (n + 5); i++){
            ft.pb(empt);
        }
    }
    void add(ll pos, ll val){
        for(pos; pos <= n; pos += (pos & (-pos))){
            ft[pos].in(val);
            // cout << "+ "<< pos << ' '  << val << endl;
        }
        // cout << endl;
    }
    void rem(ll pos, ll val){
        for(pos; pos <= n; pos += (pos & (-pos))){
            ft[pos].erase(ft[pos].find(val));
            // cout << "- "<< pos << ' '  << val << endl;
        }
    }
    ll get(ll pos){
        ll ans = 0;
        for(pos; pos > 0; pos -= (pos & (-pos))){
            ll mx = *(--ft[pos].end());
            ans = max(ans, mx);
        }
        return ans;
    }
};
void _()
{
    BT suf;
    ll n, x, i, j, c = 0, ans = 0;
    cin >> n >> x;
    suf.init(2 * n);
    vl v(n + 1), p(n + 1), cm;
    for(i = 1; i <= n; i++){
        cin >> v[i];
        cm.pb(v[i]);
        cm.pb(v[i] - x);
    }   
    map<ll, ll> cmp;
    sort(all(cm));
    for(auto k: cm){
        if(!cmp[k]){
            cmp[k] = (++c);
        }
    }
    ll mx = (2 * n + 1);
    // cout << mx << ' ' << cmp[v[n]] << endl;
    for(i = n; i > 0; i--){
        // cerr << i << endl;
        p[i] = cmp[v[i] - x];
        v[i] = cmp[v[i]];
        ll pos = (mx - v[i]);
        ll to = suf.get(pos - 1), new_val = to + 1;
        dp[i] = new_val;
        suf.add(pos, new_val);
        // cout << "+ " << pos << ' ' << new_val << endl;
    }
    // cerr << "#" << endl;
    BIT pref;
    pref.init(2 * n);
    for(i = 1; i <= n; i++){
        ll from = pref.get(p[i] - 1);
        pref.add(p[i], from + 1);
        ll pos = (mx - v[i]);
        // cerr << pos << endl;
        suf.rem(pos, dp[i]);
        // cout << "- " << pos << ' ' << dp[i] << endl;
        ll to = suf.get((mx - p[i]) - 1);
        ans = max(ans, from + to + 1);
    }
    cout << ans << endl;
    // for(i = 1; i <= n; i++){
    //     cout << dp[i] << ' ';
    // }cout << endl;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) _();
}
/*
8 10
7 3 5 12 2 7 3 4
*/
#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...