NOIP模拟赛 T3:与众不同(线段树+滑动窗口)

NOIP模拟赛 T3:与众不同

问题描述:

A是某公司的CEO,每个月都会有员工把公司的盈利数据送给A,A是个与众不同的怪人,A不注重盈利还是亏本,而是喜欢研究”完美序列”:连续的互不相同的序列.A想知道区间[L,R]之间最长的完美序列.

输入格式:

第一行两个整数N,M(1<=N,M<=200000),N表示连续N个月,编号为0到N-1,M表示询问的次数。
第二行N个整数(绝对值不超过10^6),第i个数表示该公司第i个月的盈利值。
接下来M行每行两个整数L,R(0<=L<=R<=N-1),表示A询问的区间。

输出格式:

输出M行,每行一个整数对应询问区间内的完美序列的最长长度。

输入样例:

9 2
2 5 4 1 2 3 6 2 4
0 8
2 6

输出样例:

6
5

数据范围:

数据有梯度

题目分析:

求连续的互不相同区间,显然是一个滑动窗口的经典问题:
- 每当窗口向右拓展时,考虑该点的值是否出现过,若出现过,将窗口左指针向右移动,直至该点的值出现次数达到一次,这样一次操作是O(n)的,但是N,M均可以达到2*10^5,简单的滑动窗口操作的时间复杂度为O(nm),必定会超时.
考虑如何降低时间复杂度:
- 对于每一次询问的[L,R]区间,其中的点无非存在两种情况:
- 一种是区间中的点可以形成以该点为起点的最长完美区间,即i点延伸出去形成的最长完美区间到的最后一个点last[i]必定是在R以左的,这种情况下该点的答案显然是最长完美区间长度.
- 另一种是区间中的点不能在该询问区间内形成以其为起点的最长完美区间,其答案显然为R-i+1.
可以发现,实际上last数组中的值是单调递增的,证明之:
- 对于i点的值为last[i],那么对于i+1号点来说,在last[i]之前,i+1比i包含的数要少,那么i+1号点至少可以延伸到last[i],所以last[i+1]>=last[i].而last在R以右的点在此询问区间的答案是R-i+1.那么可以用二分查找来找到这个询问区间的分界点.
则有,区间询问的答案ans=max(max{L,k-1},R-k+1)(k是二分到的分界点)
观察max中右边很简单,而左边显然就是一个RMQ(区间最值)问题,可以用st表,线段树来实现(前者询问的时间复杂度低于后者,但是后者写起来要好写一些)

代码:

线段树实现RMQ:


                
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值