Submission #1145074

#TimeUsernameProblemLanguageResultExecution timeMemory
1145074ereringGlobal Warming (CEOI18_glo)C++20
0 / 100
84 ms17732 KiB
#include <bits/stdc++.h>

using namespace std;
#define endl '\n'
#define pb push_back
#define int long long
const long long inf = 1e18;
const int MOD = 5000000;
const int N = 3e5 + 5;
int seg[N * 4], offset = 1, last[N], last2[N];

void update(int idx, int val) {
  idx += offset;
  seg[idx] = val;
  idx /= 2;
  while (idx > 0) {
    seg[idx] = max(seg[idx * 2], seg[idx * 2 + 1]);
    idx /= 2;
  }
}

int query(int node, int qlo, int qhi, int lo, int hi) {
  if (lo >= qlo && hi <= qhi) {
    return seg[node];
  }
  if (lo > qhi || hi < qlo)return 0;
  int mid = (lo + hi) / 2;
  return max(query(node * 2, qlo, qhi, lo, mid), query(node * 2 + 1, qlo, qhi, mid + 1, hi));
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, d;
  cin >> n >> d;
  int a[n], b[n], cnt = 1;
  map<int, int> mp;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    mp[a[i]];
    b[i] = a[i];
  }
  sort(b, b + n);
  int r = 0;
  for (int i = 0; i < n; i++) {
    while (r < n && b[i] + d > b[r])r++;
    if (r != 0)last[b[i]] = b[r-1];
    else last[b[i]] = -1;
  }
  while (offset < mp.size()+1)offset *= 2;
  for (auto i: mp)mp[i.first] = cnt++;
  int pref[n], suff[n];
  for (int i = 0; i < n; i++) {
    if (last[a[i]] == -1)last2[mp[a[i]]] = 0;
    else last2[mp[a[i]]] = mp[last[a[i]]];
  }
  for (int i = 0; i < n; i++) {
    a[i] = mp[a[i]];
    int x = query(1, 0, last2[a[i]], 0, offset - 1) + 1;
    pref[i] = x;
    x = query(1, 0, a[i] - 1, 0, offset - 1) + 1;
    update(a[i], x);
  }
  memset(seg, 0, sizeof(seg));
  for (int i = n - 1; i >= 0; i--) {
    int x;
    if (a[i] + 1 > cnt - 1)x = 1;
    else x = query(1, a[i] + 1, cnt - 1, 0, offset - 1) + 1;
    suff[i] = x;
    update(a[i], x);
  }
  int ans = suff[0];
  for (int i = 1; i < n; i++) {
    ans = max(ans, suff[i]);
  }
  cout << ans;
}
#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...