제출 #1164656

#제출 시각아이디문제언어결과실행 시간메모리
1164656Jawad_Akbar_JJRabbit Carrot (LMIO19_triusis)C++20
100 / 100
356 ms165108 KiB
#include <iostream> using namespace std; int inf = 1e9 + 7; struct segtree{ segtree *lc, *rc; bool Lc = 0, Rc = 0; int Mn = inf; void Add(int i, int vl, int st = -inf, int en = inf){ if (i >= en or i < st) return; // cout<<st<<" "<<en<<" "<<i<<" "<<vl<<'\n'; if (en - st == 1){ Mn = vl; return; } if (!Lc){ lc = new segtree(); rc = new segtree(); Lc = Rc = 1; } lc->Add(i, vl, st, (st + en) / 2); rc->Add(i, vl, (st + en) / 2, en); Mn = min(lc->Mn, rc->Mn); } int get(int l, int r, int st = -inf, int en = inf){ if (l <= st and r >= en) return Mn; if (l >= en or r <= st or Lc == 0) return 1e9; return min(lc->get(l, r, st, (st + en) / 2), rc->get(l, r, (st + en) / 2, en)); } }; int main(){ // ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); segtree *Seg = new segtree(); // return 0; int n, M, a; cin>>n>>M; int Ans = n; Seg->Add(0, 0); for (int i=1;i<=n;i++){ cin>>a; int b = a - i * M; int dp = Seg->get(b, inf) + i - 1; // cout<<i<<" "<<dp<<'\n'; // cout<<"inssert "<<b<<" "<<dp<<" "<<dp - i<<'\n'; Ans = min(Ans, n - i + dp); Seg->Add(b, dp - i); } cout<<Ans<<'\n'; } /* 5 400 300 700 200 1000 500 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...