題意:買瓜,每天的瓜有不同的**和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 ...