제출 #1166621

#제출 시각아이디문제언어결과실행 시간메모리
1166621khoile08Rabbit Carrot (LMIO19_triusis)C++17
100 / 100
17 ms6588 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i,a,b) for(int i = a; i <= b; i++) #define FOD(i,a,b) for(int i = a; i >= b; i--) #define fi first #define se second #define pb push_back #define ll long long #define ull unsigned long long #define lcm(a,b) (a*b)/__gcd(a,b) #define ii pair<int,int> #define iii pair<int,pair<int,int>> #define iv pair<pair<int,int>,pair<int,int>> #define sq(a) (a) * (a) const int inf = 1e9; const ll INF = 1e18; const int mod = 1e9 + 7; const int N = 2e5 + 5; const int dx[] = {-1,0,1,0}; const int dy[] = {0,1,0,-1}; const int dxx[] = {-1,-1,0,1,1,1,0,-1}; const int dyy[] = {0,1,1,1,0,-1,-1,-1}; /* Thay vì đếm số thay đổi ít nhất, tính số giữ lại nhiều nhất: Khi giữ lại i, ta có thể giữ lại k nếu (a[i] - a[k]) / (i - k) <= m ⇔ ai <= ak + m * (i - k) ⇔ ai <= ak + m * i - m * k ⇔ ai - m * i <= ak - m * k ⇔ ci <= ck (ci = ai - mi * i) => tìm dãy con ko tăng */ int n, m; vector<ll> dp, c; ll a[N]; void solve() { FOR(i,1,n) if(i * m >= a[i]) c.pb(a[i] - m * i); if(c.empty()) { cout << n << '\n'; return; } dp.pb(c[(int)c.size()-1]); FOD(i,(int)c.size()-2,0) { int pos = upper_bound(dp.begin(), dp.end(), c[i]) - dp.begin(); if(pos == dp.size()) dp.pb(c[i]); else dp[pos] = c[i]; } cout << n - dp.size() << '\n'; } signed main() { // freopen("test.inp", "r", stdin); // freopen("test.out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int test = 1; // cin >> test; while(test--) { cin >> n >> m; FOR(i,1,n) cin >> a[i]; solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...