제출 #591050

#제출 시각아이디문제언어결과실행 시간메모리
591050fuad27K개의 묶음 (IZhO14_blocks)C++17
0 / 100
1 ms328 KiB
/* * Created: 2022-07-06 12:51 */ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; using namespace chrono; // using namespace atcoder template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long ll; typedef long double ld; const ll inf = 1e18; #define pii pair<int,int> #define pll pair<ll,ll> #define vi vector<int> #define vll vector<ll> #define rep(i, a, b) for(int i = (a);i<(b);i++) #define repn(i, a, b) for(int i = (a);i>=(b);i--) #define ss second #define ff first #define mkp make_pair #define pb push_back #define all(x) (x).begin(), (x).end() const int N = 100'010; long long T[2*N]; int n; int sz; void build(long long a[]) { for(int i = 0;i<sz;i++)T[i+sz]=a[i]; for(int i = sz-1;i>0;i--)T[i]=min(T[i<<1],T[i<<1|1]); } ll query(int l, int r) { ll res=inf; for(l+=sz,r+=sz;l<r;l>>=1ll,r>>=1ll) { if(l&1)res=min(res, T[l++]); if(r&1)res=min(res, T[--r]); } return res; } void solve() { int k; cin >> n >> k; sz=n+1; ll dp[k+1][n+1]; ll a[n+1]; rep(i, 1, n+1)cin >> a[i]; a[0]=inf; vector<int> stk; vector<int> pr(n+1); stk.push_back(0); rep(i, 1, n+1) { while(a[stk.back()]<=a[i])stk.pop_back(); pr[i]=stk.back(); stk.pb(i); } rep(i, 1, k+1) { dp[i][0]=1; } rep(i, 1, n+1)dp[0][i]=inf; dp[0][0]=0; rep(j, 1, k+1) { build(dp[j-1]); rep(i, 1, n+1) { if(pr[i]!=0)dp[j][i] = min(query(pr[i]+1,i-1)+a[i], dp[j][pr[i]]); else dp[j][i]=query(pr[i],i-1)+a[i]; } } cout<<dp[k][n]<<"\n"; } int main () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; while(t--) { solve(); } 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...