BZOJ 3831 POI2014 Litter Bird
dp[i]表示前i棵树的最小体力消耗值
但是如果直接上肯定时间复杂度会爆炸 (N*Q*K)
N和Q已经无法优化
所以需要优化k 通过一种数据结构找到 k个位置中最合适的位置 从而达到N*Q的时间复杂度
线段树和树状数组略有吃力,所以需要根据题目的单调性需要单调队列。
什么情况需要优化呢?
1.当前的位置dp值相等 但比之前的k个数的中某个数大 那肯定保留大的
2.如果dp值不相等 肯定保留小的那个位置
代码实现前仔细思考!!!!
1 #include <cstdio> 2 #include <queue> 3 #include <algorithm> 4 #include <cstring> 5 6 inline int Read(){ 7 int x = 0,f = 1; 8 char ch = getchar(); 9 while(ch < '0' || ch >'9'){ 10 if(ch=='-') f = -1; 11 ch = getchar(); 12 } 13 while(ch >= '0' && ch <= '9'){ 14 x = x*10 + ch - '0'; 15 ch = getchar(); 16 } 17 return x*f; 18 } 19 20 int dp[1000005],num[1000005]; 21 int n,m; 22 std::deque<int>Q; 23 24 int GetOut(int k){ 25 memset(dp,0x3f3f3f3f,sizeof(dp)); 26 Q.clear(); 27 Q.push_back(1); 28 dp[1]=0; 29 for(int i=2;i<=n;i++){ 30 //printf("fuck\n"); 31 while(!Q.empty() && Q.front() < i - k) Q.pop_front(); 32 dp[i] = dp[Q.front()] + (num[i] >= num[Q.front()]); 33 //printf("fuck\n"); 34 while( !Q.empty() ){ 35 if(dp[i] == dp[Q.back()]){ 36 if(num[i] > num[Q.back()]){ 37 Q.pop_back(); 38 } 39 else break; 40 } 41 else{ 42 if(dp[i] < dp[Q.back()]){ 43 Q.pop_back(); 44 } 45 else break; 46 } 47 } 48 Q.push_back(i); 49 //printf("%d\n",i); 50 } 51 return dp[n]; 52 } 53 54 void init(){ 55 n = Read(); 56 for(int i=1;i<=n;i++){ 57 num[i] = Read(); 58 } 59 m = Read(); 60 for(int i=1;i<=m;i++){ 61 printf("%d\n",GetOut( Read() )); 62 } 63 return; 64 } 65 66 int main(){ 67 init(); 68 return 0; 69 }
转载于:https://www.cnblogs.com/OIerLYF/p/7496017.html
BZOJ 3831 POI2014 Litter Bird相关推荐
- 洛谷P3572 [POI2014]PTA-Little Bird
P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...
- P3572 [POI2014]PTA-Little Bird
P3572 [POI2014]PTA-Little Bird 一只鸟从1跳到n.从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制k,求每次最少耗费多少体力 很简短的题目哼. ...
- 【BZOJ3831】[Poi2014]Little Bird 单调队列
[BZOJ3831][Poi2014]Little Bird Description In the Byteotian Line Forest there are trees in a row. ...
- 【BZOJ 3831】【Poi2014】Little Bird(单调队列优化dp)
题干: Description In the Byteotian Line Forest there are trees in a row. On top of the first one, th ...
- Little Bird(BZOJ 3831)
题目大意: 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在第i棵树,那么他可以跳到第i+1,i+2,...,i+k棵树. 如果MHY跳到一棵不矮于当前 ...
- BZOJ 3524: [Poi2014]Couriers【主席树】
3524: [Poi2014]Couriers [题目描述] 传送门 [题解] 主席树的裸题,要找出现次数大于一半的,那么他肯定出现在当前的左子树或右子树中,就这样查找就可以了. 代码如下 #incl ...
- [Luogu P3571] [BZOJ 3835] [POI2014]SUP-Supercomputer
洛谷传送门 BZOJ传送门 题目描述 给定一棵NNN个节点的有根树,根节点为111.QQQ次询问,每次给定一个KKK,用最少的操作次数遍历完整棵树,输出最少操作次数.每次操作可以选择访问不超过KKK个 ...
- BZOJ.3524.[POI2014]Couriers(主席树)
题目链接 //119964kb 5780ms //主席树裸题啊.. #include <cstdio> #include <cctype> #define gc() getch ...
- bzoj 3521: [Poi2014]Salad Bar
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3521 POI的题果然都有一些很精妙的O(n)O(n)O(n)做法 带log的比较简单,这里就 ...
- little bird
LITTLE BIRD Bzoj 3831 相对而言是一道比较简单的DP,不过它需要用单调队列优化.首先是朴素O(n2), if(d[j]>f[i]) f[i]=min(f[i],f[j]); ...
最新文章
- Java基础学习_01 概述及环境配置
- 在Linux下安装aws命令行操作
- 一文攻破结构体-C语言
- ITK:切割网格CutMesh
- 深入理解PHP Opcode缓存原理
- ASP.NET学习笔记(11)--ASP简介
- 【Nutch2.2.1基础教程之6】Nutch2.2.1抓取流程
- 每日一笑 | 在俄罗斯人眼里,没有什么是胶带解决不了的
- 编译原理:文法及其二义性(判定及消除)
- excel数据库_EXCEL憋出大招,逆袭大数据的黑马出现了
- Rust 能取代 Python,更好的实现神经网络?
- 动态规划 —— 求解二项式系数
- cartographer探秘第四章之代码解析(二) --- 传感器数据处理过程
- 点亮led灯的个数_点亮一个led灯程序
- 信息安全概论复习笔记
- 各种工作面板护眼模式颜色设置
- 北京云栖AI大热 驻云CloudCare揭云服务新趋势
- 女版乔布斯的覆灭,这是今年我听过最唏嘘的真人故事
- 【算法】牛和牛栏如何匹配到最大值
- 2016.3.18华为上机题:拼音转数字