【DS】P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I
我们已经有了高于 \(n^{1.5}\) 的在线做法。
这东西就是套路,但按 CF765F Souvenirs 的方式维护点到块太难搞了。。。
因为前者算重没事。。。
所以等我明早起来再重构。。
\[f[i][j]:block_i \to block_j
\]
\[g[i][j] :i \to R[block_j]
\]
\[h[i][j] :L[block_i] \to j
\]
\[f2[i][j] :block_i[posj,R[i]] < a_j
\]
\[f3[i][j]:block_i[1,posj] >a_j
\]
\[g[i][j]=g[i+1][j]+f2[id[i]][posi]+cal(a_i,[L[id[i]+1],R[j]])
\]
\[h[i][j]=h[i][j-1]+f3[id[j]][posj]+cal(a_j,[L[i],R[id[j]-1]])
\]
大致就是维护块与块,点到块右端点,块左端点到点,块内某个数与块内前后缀所产生的逆序对数量,将一个点到一个区间的贡献拆成一个点到一些整块的逆序对加上一个点到块内前后缀的贡献,前者需要将二元组 \((i,j)\) 表示为第 \(i\) 个块权值为 \(j\) 的点放到坐标系中。那么对于块区间 \([l,r]\) 值域在 \([L,R]\) 的就可以转化成矩阵求和,便可通过二位前缀和解决。查询的时候,可以通过容斥再加上散块相互间的贡献,后者可以通过类归并的 \(O(n+m)\) 实现,只要初始化的时候对于每个块内部排序即可。这样可以不带 log,但感觉跟暴力提取出来再跑排序可能没啥区别吧。