ZOJ 3632 DP 單調優化

2022-05-07 03:36:13 字數 1645 閱讀 3485

題意:買瓜,每天的瓜有不同的**和xu命時間,要求能苟到第n天的最小代價

定義dp方程\(dp[i]\),指苟到第\(i\)天的最小代價,所求即為\(dp[n]\)

那麼怎麼轉移就是問題,這裡的狀態表示顯然不能轉移,因為哪一天買的瓜苟到哪一刻都不知道,空間太大不足以維護

再定義乙個st表\(st[i]\),表示【能夠】苟到第\(i\)天的最小代價,那麼轉移就是dp[i]=min(dp[i-1]+瓜,st[i...n]),後者表示不買瓜直接xu命

st表肯定是乙個每一位都單調非增序列,應該可以用單調佇列優化(然而不會),所以還是放到線段樹上更新了..

#include#include#include#include#include#include#include#include#include#include#include#include#include#define rep(i,j,k) for(register int i=j;i<=k;i++)

#define rrep(i,j,k) for(register int i=j;i>=k;i--)

#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])

#define iin(a) scanf("%d",&a)

#define lin(a) scanf("%lld",&a)

#define din(a) scanf("%lf",&a)

#define s0(a) scanf("%s",a)

#define s1(a) scanf("%s",a+1)

#define print(a) printf("%lld",(ll)a)

#define enter putchar('\n')

#define blank putchar(' ')

#define println(a) printf("%lld\n",(ll)a)

#define ios ios::sync_with_stdio(0)

using namespace std;

const int maxn = 1e5+11;

const int mod = 2520;

const double eps = 1e-10;

typedef long long ll;

const ll oo = 1ll<<60;

ll read()

while(ch>='0'&&ch<='9')

return x*f;

}ll dp[maxn],a[maxn],b[maxn],n;

struct st

void pu(int o)

void update(int o,int l,int r,int k,ll v)

int m=l+r>>1;

if(k<=m) update(lc,l,m,k,v);

else update(rc,m+1,r,k,v);

pu(o);

}ll query(int o,int l,int r,int l,int r)

}st;

int main()

println(min(dp[n],st.query(1,1,n,n,n)));

}return 0;

}

ZOJ 3632 dp 優先佇列

上個禮拜學長講了優先佇列的說.emmmmmm.看著題解敲了一題.先m下。include include include include include includeusing namespace std struct gua 這裡手殘漏了個分號導致螺旋報錯 priority queueque in...

單調佇列 優化DP

佇列元素保持單調遞增 減 而保持的方式就是通過插隊,把隊尾破壞了單調性的數全部擠掉,從而使佇列元素保持單調。單調佇列的作用 優化dp。許多單調佇列優化的dp可以使複雜度直接降維,下面就以最簡單的一道題為例 在某兩座城市之間有 n 個烽火台,每個烽火台發出訊號都有一定代價。為了使情報準確地傳遞,在連續...

單調佇列優化dp

形如f i max wi的問題都可以用單調佇列優化。例題 板題 注意乙個地方 求完所有的f後 ans不是f n 而是後面的一段字尾的f 注意字尾的左端點。很顯然是rmq問題 計算字首和sum i 對於固定的右端點 i,我們想讓答案最大等價於max,可以用個單調佇列維護。但是隨便乙個資料結構直接on ...