【BZOJ3831/Poi2014】Little Bird
阿新 • • 發佈:2018-12-16
解析:
單調佇列優化DP。
狀態:表示到第個位置的最小花費。
狀態轉移方程:
答案:
明顯單調佇列優化,注意如果相同則講高度高的排在前面。
程式碼:
#include <bits/stdc++.h> using namespace std; const int Max=1000005; int n,m,t,ans; int a[Max],f[Max]; deque<int>q; inline int get_int() { int x=0,f=1; char c; for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar()); if(c=='-') f=-1,c=getchar(); for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0'; return x*f; } inline void pop(int x) { while(q.size()&&q.front()<x-m) q.pop_front(); f[x]=f[q.front()]+(a[q.front()]<=a[x]); } inline void push(int x) { while(q.size()&&(f[x]<f[q.back()]||(f[x]==f[q.back()]&&a[x]>=a[q.back()]))) q.pop_back(); q.push_back(x); } inline void solve() { push(1); for(int i=2;i<=n;i++) { pop(i); push(i); } } inline void init() { n=get_int(); for(int i=1;i<=n;i++) a[i]=get_int(); t=get_int(); while(t--) { //q.clear(); m=get_int(); solve(); cout<<f[n]<<"\n"; } } int main() { init(); return 0; }