题目描述

YYH擅长种竹子。今天他收获了一根竹子,准备将这根柱子卖给CHS。这个竹子有n-1个竹节。CHS要求一定要从竹节的地方砍,而且砍成若干段后每一段竹子中最长的一小段竹子和最短的一小段的长度差不能超过s,一段竹子至少含有l小段竹子。这可让YYH郁闷了,他希望留点力气刷题,所以他想知道他最少可以将整根竹子砍成多少段。

输入输出格式

输入格式:

输入第一行三个整数,n,s,l,意义如题目所描述

输入第二行n个整数,a[1],a[2],……,a[n],分别为每小段竹子的长度

输出格式:

如果有满足条件的砍法,输出整根竹子砍成最少的段数。否则输出-1

这道题我们很显然要用DP来做。

那么首先我们需要构造出一个DP方程

f[i]肯定由另一个状态dp转移后+1得到,那么这个状态是什么呢?

很明显就是mint[i]~i-k(在此mint表示的是以i为结尾的竹子最左端最多能延展到的位置)

看到这个之后我们想到了一个N^2DP

但是还是不够

我们想一想如何得到mint?

mint就是判断一段区间的最大值减去最小值是否满足题意

那么我们可不可以用数据结构得出这个答案呢?

显然我们可以用线段树来优化这个过程

时间复杂度O(nlogn)

同样在得出答案的过程我们也可以用线段树加速

下面贴代码

#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
using namespace std;
int a[100005];
struct mm{int v1,v2;
}t[300005];
int mint[100005];
int f[300005];
int m=1,n,s,l;
void pushdown(int i){t[i].v1=min(t[i<<1].v1,t[i<<1|1].v1);t[i].v2=max(t[i<<1].v2,t[i<<1|1].v2);}
void buildtree(){while(m<n+2)m<<=1;for(int i=1;i<=n;i++)t[i+m].v1=t[i+m].v2=a[i];for(int i=m-1;i;i--)pushdown(i);
}
int query(int l,int r)
{int maxn=-inf,minn=inf;for(l=l+m-1,r=r+m+1;l^r^1;l>>=1,r>>=1){if(~l&1)minn=min(minn,t[l^1].v1),maxn=max(maxn,t[l^1].v2);if(r&1)minn=min(minn,t[r^1].v1),maxn=max(maxn,t[r^1].v2);}return maxn-minn;
}
int que(int l,int r)
{int minn=inf;for(l+=m-1,r+=m+1;l^r^1;l>>=1,r>>=1){if(~l&1)minn=min(minn,f[l^1]);if(r&1)minn=min(minn,f[r^1]);}return minn;
}
void push(int x){f[x]=min(f[x<<1],f[x<<1|1]);}
void add(int x,int y){for(f[x+=m]=y,x>>=1;x;x>>=1)push(x);}
int main(){memset(f,127/3,sizeof(f));scanf("%d%d%d",&n,&s,&l);n++;for(int i=2;i<=n;i++)scanf("%d",&a[i]);a[1]=a[2];buildtree();int le=1;for(int i=1;i<=n;i++){int tmp=query(le,i);while(tmp>s){tmp=query(++le,i);}mint[i]=le;}add(1,0);for(int i=2;i<=n;i++)if(max(1,mint[i]-1)>i-l)add(i,inf);else add(i,que(max(1,mint[i]-1),i-l)+1);printf("%d\n",f[n+m]>=inf?-1:f[n+m]);return 0;
}

转载于:https://www.cnblogs.com/ghostfly233/p/6930075.html

YYH的苍天大竹(NOIP模拟赛Round 6)相关推荐

  1. YYH算组合数(NOIP模拟赛Round 6)

    题目描述 YYH手上有一个长度为N的数列,而且这个数列正好能表示为.现在他想知道这个数列的最大公约数是多少,请你帮帮他 输入输出格式 输入格式: 每个数据点包括多组数据,以EOF结束 对于每个数据输入 ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  4. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  5. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  6. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  7. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  8. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  9. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

最新文章

  1. WIN8、WIN7访问Windows Server 2003服务器的数据库速度很慢、远程速度很慢的解决方法...
  2. java 高级数据类型_java 数据类型(上):分类
  3. 不愧是Alibaba技术官,java数组实现单向链表
  4. 微课--Python正则表达式语法与应用(83分钟)
  5. java中判断当前日期是星期几
  6. 转义字符html识别吗,HTML转义字符对照表
  7. mac和win电脑在同一局域网下互传文件
  8. Unmapped Spring configuration files found.Please configure Spring facet.”
  9. html+antd 本地化
  10. 腾讯笔试题是c语言吗,2019腾讯校园招聘C语言笔试题和面试题答案
  11. WPS WORD 项目符号和编号,继续前一列表
  12. 计算机音乐制作 体会心得,音乐软件制作的学习感受和心得体会
  13. HTML5七夕情人节表白网页制作【纯HTML+CSS实现3D动态相册-蓝色海洋 】HTML+CSS+JavaScript
  14. 蓝牙BLE4.0-HM-10设备配对指南
  15. 笑中带泪的码农往事:入职三天被开,公司给100块叫我走人,有我惨?
  16. 在EXCEL中使用VLOOKUP函数 快速批量查找对应内容
  17. android单元测试demo,android单元测试AndroidTestCase
  18. chrome查看http请求是否压缩,以及压缩比例
  19. M401a安装armbian
  20. 毕业设计(论文)撰写内容与格式要求

热门文章

  1. 用python画梵高星空-python 梵高
  2. python装饰器实例-Python函数装饰器--实例讲解
  3. python 教程 网盘-python教程网盘
  4. python项目实例初学者-经典Python案例,初学者的小帮手,立马学会Python!
  5. 如何自学python爬虫-小白如何快速学习Python爬虫?
  6. python简单代码演示效果-Python Selenium的简单演示程序
  7. python好用-Pyzo -- 好用的 Python 轻量级 IDE
  8. python课程多少钱一节课-日照少儿python编程一节课多少钱
  9. python上海培训哪里比较好-上海python培训哪家好 Python需要多久学会
  10. python项目开发案例-Python项目开发案例集锦 PDF 全彩超清版