QOJ #9438. Two Box
首先考虑给定一个状态怎么计算答案。考虑建立一棵 \(m\) 层的树,在第 \(d\) 层的时候,考虑每个极长连续段 \([l,r]\) 满足 \(\max\limits_{i=l}^{r} a_i\geq d\),则将 \([l,r+1]\) 看作这棵树上的一个点,向 \(d+1\) 层中所有被这个区间包含的点连边。
对于第 \(i\) 层的第 \(j\) 个点,记 \(f_{i,j,S}\) 表示 \(i\) 层第 \(j\) 个点所对应区间内已经选择好了, 对于 \([1,i]\) 中的石子,\(S\) 在黑色盒子中。对于每个点要做的,就是从子树内做异或卷积,然后抹去最高位(\(r=n\) 特判)即可。
直接这样做关于 \(m\) 不是多项式的,但是观察到,对于某个固定的 \((i,j)\),\(S\) 中 \(1\) 个数相同的状态答案是一样的,因此 \(S\) 状态可以简化成 \(O(m)\) 级别的,一次 FWT 复杂度是 \(O(m^2)\),总共做到单次复杂度 \(O(nm^3)\)。
然后如果带修的话就因为一次修改影响到的点只有 \(O(m)\) 个,暴力修改即可,用一个线段树维护区间乘积,时间复杂度 \(O((n+q)m^2(m+\log n))\)。