Submission #253301

#TimeUsernameProblemLanguageResultExecution timeMemory
253301DystoriaXRabbit Carrot (LMIO19_triusis)C++14
100 / 100
68 ms4720 KiB
#include <bits/stdc++.h> using namespace std; int n, m; int h[200010]; int bit[200010]; const int MAX = 200005; vector<tuple<int, int, int> > vq; vector<int> cmp; void init(){ for(int i = 1; i <= MAX; i++) bit[i] = 1e9; } void update(int x, int val){ for(; x <= MAX; x += x & (-x)) bit[x] = min(bit[x], val); } int query(int x){ int ret = 1e9; for(; x; x -= x & (-x)) ret = min(ret, bit[x]); return ret; } int getIdx(int val){ return (int) (upper_bound(cmp.begin(), cmp.end(), val) - cmp.begin()); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> h[i]; if(h[i] <= i * m) cmp.emplace_back(i * m - h[i]); } cmp.emplace_back(0); sort(cmp.begin(), cmp.end()); cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end()); // for(auto &k : cmp) cerr << k << " "; // cerr << "\n"; init(); update(getIdx(0), 0); for(int i = 1; i <= n; i++){ if(h[i] > i * m) continue; int delta = getIdx(i * m - h[i]); // cerr << "Index of delta: " << delta << " will update with value " << i + query(delta) - 1 << "\n"; update(delta, query(delta) - 1); } cout << n + query(MAX) << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...