题链:

单调队列优化DP
定义 F[i] 为到达第i课树的疲劳值
显然最暴力的转移就是枚举i位置前面的k个位置,找到最优的位置跳过来。
每一个询问的复杂度 O(KN),最坏达到O(N²)。
考虑优化:
设H为高度的话,对于两个转移来源位置x,y(x<y),如何如何判断那个更优呢?
有如下4种情况:
1).H[y]≥H[x]且F[y]≤F[x],则任何时候选择y都不会比选择x差,所以从单调队列里去掉x。
2).H[y]≥H[x]且F[y]>F[x],在 x 由于距离原因而出队之前,选择x都不会比选择y差,所以把y放在队尾。
3).H[y]<H[x]且F[y]<F[x],则任何时候选择y都不会比选择x差,所以从单调队列里去掉x。
4).H[y]<H[x]且F[y]≥F[x],在 x 由于距离原因而出队之前,选择x都不会比选择y差,所以把y放在队尾。
然后用单调队列维护就可以啦,每一个询问的复杂度O(N)。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000500
using namespace std;
int H[MAXN],F[MAXN];
int N,Q;
void read(int &x){
static int f; static char ch;
x=0; f=1; ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-')f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
x=x*f;
}
bool off(int x,int y){
if(H[y]>=H[x]){
if(F[y]<=F[x]) return 1;
else return 0;
}
else{
if(F[y]<F[x]) return 1;
else return 0;
}
}
int main(){
static int pos[MAXN],l,r;
read(N);
for(int i=1;i<=N;i++) read(H[i]);
read(Q);
for(int q=1,k;q<=Q;q++){
read(k); l=1; r=0;
F[1]=0; pos[++r]=1;
for(int i=2;i<=N;i++){
while(l<=r&&i-pos[l]>k) l++;
F[i]=F[pos[l]]+(H[pos[l]]<=H[i]);
while(l<=r&&off(pos[r],i)) r--;
pos[++r]=i;
}
printf("%d\n",F[N]);
}
return 0;
}

  

●BZOJ 3831 [Poi2014]Little Bird的更多相关文章

  1. Bzoj 3831 [Poi2014]Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...

  2. BZOJ 3831: [Poi2014]Little Bird【动态规划】

    Description In the Byteotian Line Forest there are   trees in a row. On top of the first one, there ...

  3. 单调队列应用--BZOJ 3831 Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec  Memory Limit: 128 MB Description In the Byteotian Lin ...

  4. BZOJ 3831

    3831: [Poi2014]Little Bird Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 121  Solved: 68[Submit][S ...

  5. bzoj3831 [Poi2014]Little Bird 单调队列优化dp

    3831: [Poi2014]Little Bird Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 505  Solved: 322[Submit][ ...

  6. 单调队列优化DP || [Poi2014]Little Bird || BZOJ 3831 || Luogu P3572

    题面:[POI2014]PTA-Little Bird 题解: N<=1e6 Q<=25F[i]表示到达第i棵树时需要消耗的最小体力值F[i]=min(F[i],F[j]+(D[j]> ...

  7. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  8. P3572 [POI2014]PTA-Little Bird

    P3572 [POI2014]PTA-Little Bird 一只鸟从1跳到n.从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制k,求每次最少耗费多少体力 很简短的题目哼. ...

  9. 【BZOJ3831】[Poi2014]Little Bird 单调队列

    [BZOJ3831][Poi2014]Little Bird Description In the Byteotian Line Forest there are   trees in a row. ...

随机推荐

  1. C语言--第四周作业

    一.题目7-1 计算分段函数[1] 1.代码 #include <stdio.h> int main () { float x,result; scanf("%f",& ...

  2. PostgreSQL 配置安装

    Mac 安装 http://postgresapp.com/ 创建和删除数据库用户 对应命令如下(在postgres=# 环境下):1.查看数据库用户列表: \du2.创建数据库用户: create ...

  3. 201421123042 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 Comparable Arrays.sort -has a Lambda表达式 1.2尝试使用思维导图将这些关键词组织起来 ...

  4. Python入门代码练习

    一.循环猜年龄程序,猜错三次则打印提示信息并退出循环,猜对也打印提示信息并退出循环 count=0while count < 3: num = input("猜年龄游戏:") ...

  5. EXT3文件系统误删除导致文件系统中的邮件丢失恢复方法

    一.故障描述 由8块盘组成的RAID5, 上层是EXT3文件系统,由于误删除导致文件系统中的邮件丢失 二.镜像磁盘为防止数据恢复过程中由于误操作对原始磁盘造成二次破坏, 使用winhex软件为每块磁盘 ...

  6. Win7下安装composer, 并使用其安装smarty

    安装composer需要开启PHP openssl扩展. 1) 先查看PHP是否开启了openssl扩展 键盘win+r 输出cmd, 可以看到Dos窗口, 然后执行php -m (需要添加PHP环境 ...

  7. 使用cxf创建webservice 出现timeOut的问题,设置spring超时时间

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. 使用URL访问http服务器

    一.概念定义 1.URI - 通用资源标识符 URI通常由三部分组成, 资源访问机制 存放资源的主机名 资源自身名称 如: http://www.baidu.com/html http://www.b ...

  9. SiteMesh入门(1-1)SiteMesh是什么?

    1.问题的提出 在开发Web 应用时,Web页面可能由不同的人参与开发,因此开发出来的界面通常千奇百怪.五花八门,风格难以保持一致. 为了统一界面的风格,Struts 框架提供了一个标签库Tiles ...

  10. maven管理的jsp应用如何添加servlet、jsp相关依赖(org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.index_jsp)

    背景: 老大让做权限控制,研究了一下shiro,下了个demo下来,死活跑不起来,报 org.apache.jasper.JasperException: java.lang.ClassNotFoun ...