博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单调队列优化DP || [Poi2014]Little Bird || BZOJ 3831 || Luogu P3572
阅读量:5242 次
发布时间:2019-06-14

本文共 1029 字,大约阅读时间需要 3 分钟。

题面:

题解:

N<=1e6 Q<=25

F[i]表示到达第i棵树时需要消耗的最小体力值
F[i]=min(F[i],F[j]+(D[j]>=D[i])) (j>=i-K)
使用单调队列维护
越小的越优,在写单调队列时,让F值最小的数越前
因为F[i]-F[j]最多等于1
然后如果F值相同,则D越大的越优,因为D越大,后面不用+1的概率越大
大概就是这样

代码:

1 #include
2 #include
3 #define min(a,b) ((a)<(b)?(a):(b)) 4 #define max(a,b) ((a)>(b)?(a):(b)) 5 using namespace std; 6 int rd(){ 7 int x=0; char c=getchar(); 8 while(c<'0'||c>'9') c=getchar(); 9 while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}10 return x;11 }12 const int maxn=1e6+5,maxq=30,inf=1<<30;13 int N,D[maxn],F[maxn],Q,K,f1,f2;14 int que[maxn];15 int main(){16 N=rd();17 for(int i=1;i<=N;i++) D[i]=rd();18 Q=rd();19 while(Q--){20 f1=1;f2=0;21 que[++f2]=1;22 K=rd();23 for(int i=2;i<=N;i++){24 while(f1<=f2 && que[f1]
D[que[f2]]) f2--;28 que[++f2]=i;29 }30 printf("%d\n",F[N]);31 }32 return 0;33 }

By:AlenaNuna

 

转载于:https://www.cnblogs.com/AlenaNuna/p/11559673.html

你可能感兴趣的文章
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>