제출 #513780

#제출 시각아이디문제언어결과실행 시간메모리
513780czhang2718Financial Report (JOI21_financial)C++17
100 / 100
1292 ms68520 KiB
#include "bits/stdc++.h"
using namespace std;

const int N=300001;

int n, d;
int a[N];
int mx[4*N];

int get_max(int l, int r, int x, int lx, int rx){
  if(lx>=r || rx<=l) return 0;
  if(lx>=l && rx<=r) return mx[x];
  int m=(lx+rx)/2;
  return max(get_max(l, r, 2*x+1, lx, m), get_max(l, r, 2*x+2, m, rx));
}

int get_max(int l, int r){ return get_max(l, r, 0, 0, n+1); }

void upd(int i, int v, int x, int lx, int rx){
  if(rx-lx==1){
    mx[x]=v;
    return;
  }
  int m=(lx+rx)/2;
  if(i<m) upd(i, v, 2*x+1, lx, m);
  else upd(i, v, 2*x+2, m, rx);
  mx[x]=max(mx[2*x+1], mx[2*x+2]);
}

void upd(int i, int v){ upd(i, v, 0, 0, n+1); }

int main(){
  cin.tie(0)->sync_with_stdio(0);

  cin >> n >> d; 
  set<int> s;
  map<int, int> mp;
  vector<vector<int>> ind(n+1);
  for(int i=1; i<=n; i++){
    cin >> a[i];
    s.insert(a[i]);
  }
  int cur=0;
  for(auto it=s.begin(); it!=s.end(); it++){
    mp[*it]=++cur;
  }
  for(int i=1; i<=n; i++){
    a[i]=mp[a[i]];
    ind[a[i]].push_back(i);
  }

  set<int> small, bad;
  for(int i=d; i<=n; i++) bad.insert(i);
  small.insert(0); small.insert(n+1);
  vector<int> dp(n+1);

  auto ins=[&](int i){
    int l=*--small.upper_bound(i);
    int r=*small.upper_bound(i);
    small.insert(i);
    if(r-l+1<d) return;
    for(int j=max(i, l+d-1); i>=j-d+1 && j<=r; j++){
      // cout << "erase " << j << "\n";
      bad.erase(j);
    }
  };

  int ans=0;
  for(int k=1; k<=n; k++){
    for(int i:ind[k]){
      ins(i);
      auto it=bad.upper_bound(i);
      int l=it==bad.begin()?0:*--it-d+1;
      dp[i]=get_max(l, i)+1;
      // cout << "dp[" << i << "] = " << dp[i] << "\n";
      // cout << "try [" << l << ", " << i << ")\n";
    }
    for(int i:ind[k]){
      upd(i, dp[i]);
      ans=max(ans, dp[i]);
    }
  }
  cout << ans;
}
// segment tree max, update point
#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...