Problem p02537 (C++) — buggy submission, verdict: Time Limit Exceeded

#include "bits/stdc++.h"
// #include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;

template <typename T>
void print_vec(const vector<T> &v, bool is_reverse = false, ll num = 0) {
  if (num == 0)
    num = (ll)v.size();
  cout << endl;
  cout << "i=  ";
  for (ll i = 0; i < num; i++)
    cout << i << "   ";
  cout << endl;
  cout << "    ";
  if (is_reverse)
    for (ll i = num - 1; i >= 0; i--) {
      cout << v[i];
      if (i != 0)
        cout << "   ";
    }
  else
    for (ll i = 0; i < num; i++) {
      cout << v[i];
      if (i != num - 1)
        cout << "   ";
    }
  cout << endl;
}

// template <typename T>
// void print_pairvec(const vector<T> &v, ll num=0){
//   if(num == 0) num = (ll)v.size();
//   cout << endl; for(ll i=0; i<num; i++){ cout << v[i].first << " " <<
//   v[i].second << endl;}
// }
template <typename T> void print_pairvec(const T &_pair, ll num = 0) {
  cout << endl;
  for (pair<ll, int> x : _pair) {
    cout << x.first << " " << x.second << endl;
  }
}

template <typename T> void print_vec2(const vector<vector<T>> &v) {
  cout << endl;
  cout << "       ";
  for (ll i = 0; i < v[0].size(); i++)
    cout << i << "   ";
  cout << endl;
  for (ll i = 0; i < v.size(); i++) {
    cout << "i=" << i << ":   ";
    for (ll j = 0; j < v[i].size(); j++) {
      if (v[i][j] == 0)
        cout << "\\x1B[0m" << v[i][j] << "   ";
      else
        cout << "\\x1B[31m" << v[i][j]
             << "   "; // https://stackoverrun.com/ja/q/12618775
    }
    cout << "\\x1B[0m" << endl;
  }
}

const int INF = 1e+5;
int op(int a, int b) { return max(a, b); }
// int e(){return -INF;}
int e() { return 0; }
int main() {
  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];

  const int A_MAX = 3e5 + 5;
  segtree<int, op, e> seg(A_MAX + 5);
  // dp[j]: 最後がjであるときのaの部分列の最大長
  for (int i = 0; i < n; i++) {
    int j = a[i];
    int l = max(0, j - k);
    int r = min(j + k + 1, A_MAX);
    seg.set(j, seg.prod(l, r) + 1);
  }

  // int ans = seg.all_prod();
  int ans = seg.prod(0, A_MAX);
  cout << ans << endl;
  return 0;
  // cout << fixed;//小数点を確実に10桁で表示するためのもの
  // cout << setprecision(10);
}


Error: TLE

Fixed submission:

// #include "bits/stdc++.h"
#include <bits/stdc++.h>
using namespace std;
// using namespace atcoder;
using ll = long long;

template <typename T>
void print_vec(const vector<T> &v, bool is_reverse = false, ll num = 0) {
  if (num == 0)
    num = (ll)v.size();
  cout << endl;
  cout << "i=  ";
  for (ll i = 0; i < num; i++)
    cout << i << "   ";
  cout << endl;
  cout << "    ";
  if (is_reverse)
    for (ll i = num - 1; i >= 0; i--) {
      cout << v[i];
      if (i != 0)
        cout << "   ";
    }
  else
    for (ll i = 0; i < num; i++) {
      cout << v[i];
      if (i != num - 1)
        cout << "   ";
    }
  cout << endl;
}

// template <typename T>
// void print_pairvec(const vector<T> &v, ll num=0){
//   if(num == 0) num = (ll)v.size();
//   cout << endl; for(ll i=0; i<num; i++){ cout << v[i].first << " " <<
//   v[i].second << endl;}
// }
template <typename T> void print_pairvec(const T &_pair, ll num = 0) {
  cout << endl;
  for (pair<ll, int> x : _pair) {
    cout << x.first << " " << x.second << endl;
  }
}

template <typename T> void print_vec2(const vector<vector<T>> &v) {
  cout << endl;
  cout << "       ";
  for (ll i = 0; i < v[0].size(); i++)
    cout << i << "   ";
  cout << endl;
  for (ll i = 0; i < v.size(); i++) {
    cout << "i=" << i << ":   ";
    for (ll j = 0; j < v[i].size(); j++) {
      if (v[i][j] == 0)
        cout << "\\x1B[0m" << v[i][j] << "   ";
      else
        cout << "\\x1B[31m" << v[i][j]
             << "   "; // https://stackoverrun.com/ja/q/12618775
    }
    cout << "\\x1B[0m" << endl;
  }
}

int main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];

  const ll MAX = 3e5 + 10;
  vector<ll> vec(MAX, 0);
  for (int i = 0; i < n; i++) {
    ll tmp = vec[a[i]];
    for (int j = a[i] - k; j <= a[i] + k; j++) {
      if (j >= MAX)
        continue;
      if (j < 0)
        continue;
      tmp = max(tmp, vec[j] + 1);
    }
    vec[a[i]] = tmp;
  }

  ll ans = 0;
  for (int i = 0; i < (int)vec.size(); i++)
    ans = max(ans, vec[i]);
  cout << ans << endl;

  return 0;
  // // const ll MAX =3e5+k + 10;
  // // vector<ll> dp(MAX + 5, 0);

  // // for(int i=0; i<N; i++){
  // //   for(int j)
  // // }

  // vector<stack<ll>> st;
  // // using P = pair<ll, int>;
  // // vector<P> backs;
  // vector<ll> backs;
  // for(int i=0; i<n; i++){
  //   bool is_add = false;
  //   ll l_index, r_index;
  //   ll l_index = lower_bound(backs.begin(), backs.end(), a[i]-k) -
  //   backs.begin(); ll r_index = upper_bound(backs.begin(), backs.end(), a[i]
  //   + k) - backs.begin(); vector<stack<ll>> tmp_st; vector<ll> tmp_backs;
  //   // ll size = (ll)st.size();
  //   for(int j=l_index; j<= r_index; j++){
  //     // int index = backs[j].second;
  //     // ll x = st[index].top();
  //     ll x =
  //     if(abs(x - a[i]) <= k ){
  //       stack<ll> b;
  //       b = st[j];
  //       b.push(a[i]);
  //       is_add = true;
  //       tmp_st.push_back(b);
  //       tmp_st.push_back(st[j]);
  //     }
  //     else tmp_st.push_back(st[j]);
  //   }

  //   // for(int j=0; j<size; j++){
  //   //   ll x = st[j].top();
  //   //   if(abs(x - a[i]) <= k){
  //   //     stack<ll> b;
  //   //     b = st[j];
  //   //     b.push(a[i]);
  //   //     // st.push_back(b);
  //   //     is_add = true;
  //   //     tmp_st.push_back(b);
  //   //     tmp_st.push_back(st[j]);
  //   //     tmp_backs.push_back()
  //   //   }
  //   //   else tmp_st.push_back(st[j]);

  //   st.clear();
  //   st = tmp_st;
  //   if(is_add == false){
  //     stack<ll> b;
  //     b.push(a[i]);
  //     st.push_back(b);
  //   }
  // }

  // ll ans = 0;
  // for(stack<ll> x: st) ans = max(ans, (ll)x.size());

  // cout << ans << endl;

  return 0;
  // cout << fixed;//小数点を確実に10桁で表示するためのもの
  // cout << setprecision(10);
}