sicily 1137 河床

线段树

题意:
给你一个n个元素的数组,和一个整数k.求一个符合以下条件的最大的区间
条件:区间里任意两个元素的差值不能超过k

数据范围:
n<=30000,k<=100,元素ai<=32676

思路:

暴力的话枚举每个左端点,然后往右扫,维护最大值和最小值,扫到使得max-min>k的时候就停止掉.这样做的复杂度理论上是O(n2).不过这里好像可以水过

正确的做法是用线段树.考虑某个固定的左端点,那么右端点的下标不断往右移的话,整个区间的max-min应该是递增的.也就是说,我们可以二分右端点,看这个区间的max-min是否<=k.

如何快速地求一个区间的max和min,线段树!那么,枚举左端点是O(n),二分右端点是O(logn),区间询问max和min是O(logn),总的复杂度就是O(nlognlogn)

总结:枚举左端点,二分右端点,线段树求区间max,min,判定max-min<=k


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值