DP(Nietzsche)的hu测 T3(规律?主席树)

版权属于DP,想要引用此题(包括题面)的朋友请联系博主

DP(Nietzsche)的hu测 T3(规律?主席树)
DP(Nietzsche)的hu测 T3(规律?主席树)

分析:
这道是结论题

A or B+A and B=A+B

假设我们找到区间中最大的数A
则在ta旁边的任意一个数小于ta,A or B+A and B=A+B<A+A
也就是说,我们选择两个数,不如只选择A优秀
同理,我们可以用归纳法扩展到整个序列
因此答案就是区间最大值

tip

这道题是原创题,结果就出了这么大的锅。。。
我竟然想用线段树维护区间最大值
完全是多余,没有修改操作,询问超多,直接RMQ即可

自己还是太弱了,对于算法和数据结构的理解非常不到位,很有可能知道解法却因选错实现方法而成千古恨,高度警惕。。。


在出题人DP的深切致歉后,DP又搬出了一道题:

改成or+GCD

20%
暴力

另外20%
n2暴力预处理区间值插到主席树上然后查询
按照区间右端点建立主席树,主席树中是左端点,维护最大值
n2log+Mlog

另外20%
并不是所有区间的值都有价值,
如果以R为右端点的区间[L1,R]
存在[L2,R]>[L1,R]L2>L1[L1,R]没有价值
随机数据下每个右端点的有价值区间不会比log多(事实上不随机也是如此)
n2求取所有区间的值,再把有价值的插入主席树
n2+(n+m)log

100%
第3个做法中,n2找到所有区间的值太暴力了,
考虑是不是可以不找出所有区间的值,直接找出需要插入的值
考虑对于同一个右端点,在左移左端点扩大区间时
如果只是or的话,ta是单调不降
如果只是GCD的话,ta是单调不升
对于or+GCD而言
考虑每一次or发生增加的时候左端点的位置,这样的位置最多有log个,
两个这样的位置之间的左端点位置所代表的区间值的大小只受GCD支配是不升
所以ta们都不如右边的那个or增加的位置优,这样我们只要找的这样的or发生增加的位置插入主席树即可
找法是维护f[k]为位置i及其之前的所有位置中最后一个(二进制k位为1)的位置