版权属于DP,想要引用此题(包括题面)的朋友请联系博主
分析:
这道是结论题
假设我们找到区间中最大的数
A
A
则在ta旁边的任意一个数小于ta,
也就是说,我们选择两个数,不如只选择A优秀
同理,我们可以用归纳法扩展到整个序列
因此答案就是区间最大值
tip
这道题是原创题,结果就出了这么大的锅。。。
我竟然想用线段树维护区间最大值
完全是多余,没有修改操作,询问超多,直接RMQ即可自己还是太弱了,对于算法和数据结构的理解非常不到位,很有可能知道解法却因选错实现方法而成千古恨,高度警惕。。。
在出题人DP的深切致歉后,DP又搬出了一道题:
改成or+GCD
20%
暴力
另外20%
n2
n
2
暴力预处理区间值插到主席树上然后查询
按照区间右端点建立主席树,主席树中是左端点,维护最大值
n2log+Mlog
n
2
l
o
g
+
M
l
o
g
另外20%
并不是所有区间的值都有价值,
如果以
R
R
为右端点的区间
存在
[L2,R]>[L1,R]
[
L
2
,
R
]
>
[
L
1
,
R
]
且
L2>L1
L
2
>
L
1
则
[L1,R]
[
L
1
,
R
]
没有价值
随机数据下每个右端点的有价值区间不会比log多(事实上不随机也是如此)
n2
n
2
求取所有区间的值,再把有价值的插入主席树
n2+(n+m)log
n
2
+
(
n
+
m
)
l
o
g
100%
第3个做法中,
n2
n
2
找到所有区间的值太暴力了,
考虑是不是可以不找出所有区间的值,直接找出需要插入的值
考虑对于同一个右端点,在左移左端点扩大区间时
如果只是
or
o
r
的话,ta是单调不降的
如果只是
GCD
G
C
D
的话,ta是单调不升的
对于
or+GCD
o
r
+
G
C
D
而言
考虑每一次
or
o
r
发生增加的时候左端点的位置,这样的位置最多有
log
l
o
g
个,
两个这样的位置之间的左端点位置所代表的区间值的大小只受
GCD
G
C
D
支配是不升的
所以ta们都不如右边的那个or增加的位置优,这样我们只要找的这样的or发生增加的位置插入主席树即可
找法是维护
f[k]
f
[
k
]
为位置
i
i
及其之前的所有位置中最后一个(二进制位为1)的位置