Glad You Came
题意
不晓得咋说……反正就是把m个区间对应m个vi,对于每一个区间的数字,小于vi的都变成vi,最后求最终结果的i*a[i]的异或。
1、线段树:肯定要维护一个最小值,而且这题由于初始的ai都是0,因此min也是0,而且暴力单点更新,我们只需要建一个一维的数组就好了。然后一个update函数,一个最终结果的计算函数,注意剪枝:” $if(tree[index].val>=v) return “$。
2、反向ST表:我的理解是,对于一个区间$dp[i][d]$,表示的是从i位置开始长度为$2^d$的区间,也就是$[i , i+2^d-1]$。
比如对于区间[1,10],长度为10,那么我们找到最大的那个<10的$2^d$,即8,d=3,可将区间分成两个:[1,8],[3,10],用dp[],[]表示就是$dp[1][3]$和$dp[10-2^3+1][3]$。这样对于每一次询问L,R,从一个大区间分出来的两个小区间,维护他们的max值,取max(dp ,val ) 。这样,我们就从最大的区间开始往小了维护,直到$dp[i][0]$这样。
看!代码
1 | /*线段树莽过的做法*/ |
1 |
|