NOIP模拟-数字对

**问题 C: 数字对** **时间限制: 1 Sec 内存限制: 256 MB**
**题目描述** 小H是个善于思考的学生,现在她又在思考一个有关序列的问题。 她的面前浮现出一个长度为n的序列{ai},她想找出一段区间[L, R](1 <= L <= R <= n)。 这个特殊区间满足,存在一个k(L <= k <= R),并且对于任意的i(L <= i <= R),ai都能被ak整除。这样的一个特殊区间 [L, R]价值为R – L。 小H想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢?这些区间又分别是哪些呢?你能帮助她吧。 **输入** 第一行,一个整数n. 第二行,n个整数,代表ai. **输出** 第一行两个整数,num和val,表示价值最大的特殊区间的个数以及最大价值。 第二行num个整数,按升序输出每个价值最大的特殊区间的L. **样例输入** 5 4 6 9 3 6 **样例输出** 1 3 2 **提示** 30%: 1 <= n <= 30 , 1 <= ai <= 32 60%: 1 <= n <= 3000 , 1 <= ai <= 1024. 80%: 1 <= n <= 300000 , 1 <= ai <= 1048576. 100%: 1 <= n <= 500000 , 1 <= ai <$ 2 ^{31}.$ 输出末尾有空格 **题解:** 这题很明显是RMQ,如果不会可以参考[此文](https://blog.youkuaiyun.com/qq_34531807/article/details/79354519)。 30分:枚举l,r,k,线性扫一遍O(n^4) 进一步思考 特殊区间的特点实际上就是区间最小值等于这个区间的GCD 不用枚举k变为$O(n^3)$ 再想想? 答案一定可以二分 因此我们二分答案len,判断长度为len的区间是否有可行的 时间复杂度$O(n^2 log n)$ 用$O(n)$的时间复杂度求区间最小值和GCD显然是很浪费的 一个性质:一个集合多加一个数,那么新集合的GCD就是原来集合的GCD和新数的GCD 嗯?线段树! 那就是$O(n*log n *log n)$显然第四类数据是来卡你的 因此我们可以想到RMQ 令数组$gcdn[i][j]$表示从第i个数起连续2^j个数中的GCD 令数组$minn[i][j]$表示从第i个数起连续2^j个数中的最小值 $O(n * log n)$预处理 计算答案时$O(1)$查询 所以计算答案时时间复杂度也是$O(n * log n)$ 据说当时线段树连80分都不一定能拿到 $Code:$ ``` #include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackflyDC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值