POJ 3368 Frequent values

题目大意:

给定一个非递减的整数序列(n),然后给出m个查询区间,针对每一个查询,输出次去间内出现次数最多的“次数”。

例如:n=10,m=3

非递减序列:-1 -1 1 1 1 1 3 10 10 10
查询序列:
2 3
1 10
5 10
则结果分别是:1,4,3。
看到这道题,最直接的想法是针对每一个序列q(x,y),线性扫描统计区间x~y中每一数字出现的次数,求出最大值。但是由于
m非常大,这样的查询很耗时。
提到“区间内查询问题”,这时候就想到线段树:可以用于查询某一个区间的最大值,最小值等。而查询的时间复杂度只是lgn。
但是这道题怎么用线段树来处理呢?
根据题意,给定序列时非递减序列,于是可以将相同节点通过离散化压缩到线段树的叶子节点,并记录其出现次数。所以,给
定一个查询q(x,y),如果x和y正好处在“序列中某个整数的起始和结束位置“,那么,可以通过线段树查询得到x~y间出现的最多
次数。如果是其他情况呢?
我们可以考虑把序列中相同元素分组,并根据分组情况如下划分:
1. 如果x和y在一个组,那么最长长度就是y - x + 1
2. 如果组号相差1,那么找出两者的分界点z(假设z点和x点组号相同),那么答案就是Max{z - x + 1, y - z}
3. 如果相差大于1,那么先将两头截掉,统计大的记录,再和中间那段的最大值比较大小,中间那段的最大值可以用线段树
区间查询最值


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值