1. 程式人生 > 其它 >Codeforces 940E: Cashback 單調佇列優化DP

Codeforces 940E: Cashback 單調佇列優化DP

技術標籤:DPcodeforces

傳送門

題目描述

給你一個長度為n的數列a和整數c

你需要把它任意分段

每一段假設長度為k,就去掉前 ⌊ k c ⌋ \lfloor\frac{k}{c}\rfloor ck小的數

最小化剩下的數的和

分析

我們可以把每一個長度為k的區間刪減掉一個最小值,也可以把每一個數單獨拆出來不進行刪除,所以很容易寫出狀態方程
f[i] = min(f[i - 1] + a[I],f[i - m] + sum[I] - sum[i - m] - min[i - m + 1 ~i])

最小值可以用單調佇列或者線段樹來維護

程式碼

#include <iostream>
#include <cstdio> #include <cmath> #include <algorithm> #include <queue> #include <cstring> #define debug(x) cout<<#x<<":"<<x<<endl; #define _CRT_SECURE_NO_WARNINGS #pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC option("arch=native","tune=native","no-zero-upper") #pragma GCC target("avx2") using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PII; const int INF = 0x3f3f3f3f; const int N = 1e5 + 10; int n,m; ll a[
N]; ll sum[N]; ll f[N]; struct node{ int l,r; ll v; }tr[N * 5]; void pushup(int u){ //子節點資訊更新父節點 tr[u].v = min(tr[u << 1].v,tr[u << 1 | 1].v); } void build(int u,int l,int r){ tr[u] = {l,r}; if(l == r) { tr[u].v = a[l]; return; } int mid = l + r >> 1; build(u << 1,l,mid),build(u << 1 | 1,mid + 1,r); pushup(u); } int query(int u,int l,int r){ if(tr[u].l >= l && tr[u].r <= r) return tr[u].v; int mid = tr[u].l + tr[u].r >> 1; int v = INF; if(l <= mid) v = query(u << 1,l,r); if(r > mid) v = min(v,query(u << 1 | 1,l,r)); return v; } int main(){ scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++) { scanf("%lld",&a[i]); sum[i] = sum[i - 1] + a[i]; } build(1,1,n); for(int i = 1;i <= n;i++){ f[i] = f[i - 1] + a[i]; if(i < m) continue; f[i] = min(f[i],f[i - m] + sum[i] - sum[i - m] - query(1,i - m + 1,i)); } printf("%lld\n",f[n]); return 0; } /** *  ┏┓   ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃       ┃ * ┃   ━   ┃ ++ + + + * ████━████+ * ◥██◤ ◥██◤ + * ┃   ┻   ┃ * ┃       ┃ + + * ┗━┓   ┏━┛ *   ┃   ┃ + + + +Code is far away from   *   ┃   ┃ + bug with the animal protecting *   ┃    ┗━━━┓ 神獸保佑,程式碼無bug  *   ┃        ┣┓ *   ┃        ┏┛ *  ┗┓┓┏━┳┓┏┛ + + + + *    ┃┫┫ ┃┫┫ *    ┗┻┛ ┗┻┛+ + + + */