退役前的一句话题解Ⅱ

又快退役了,所以写写一句话题解。

看起来好像有点数位dp的感觉;根据套路,如果在某一位上\(b_i<a_i\),那么之后这一位上就可以随便填了,而这个可以随便填的数我们就钦定它有调节作用,无论其他数异或的结果是什么,都可以通过这个数调整成目标结果。

我们枚举一个数位\(k\)使得\(b_i\)高于数位的部分都和\(a_i\)相等,之后搞个\(dp\),设\(dp_{i,0/1,0/1}\)表示处理了前\(i\)个数,\(k\)位上的异或值为0/1,是否钦定了调解数;考虑从\(i\)\(i+1\)转移,如果\(a_{i+1}\)在第\(k\)位是0,那么后面随便选一个小于剩余部分的数即可;如果是\(1\),我们就考虑一下是否钦定其为调节数。这样就可以写一个\(O(Qn\log w)\)的暴力了。

暴力dp

不难发现这个dp随便就可以矩乘优化,线段树维护一下,复杂度\(O(n\log n\log w)\)http://zhengruioi.com/submission/212421

一个暴力的想法,枚举一个子矩形,求交恰为这个子矩形的方案数有多少;我们发现做这个的时候大概就需要容斥一下,设\(F(n,m)\)表示交至少为\(n\times m\)子矩形的方案数,发现只需要算\(F(1,1)-F(1,2)-F(2,1)+F(2,2)\)。于是我们需要对于这四种大小的矩形求有多少个矩形将其包含。

现在有了一个\(O(n^4)\)的做法,以求\(F(1,1)\)为例,枚举一个全\(1\)子矩形,考虑这个子矩形包含了哪些\(1\times 1\)大小的子矩形,这个影响就是一个子矩阵加\(1\),差分一下即可。\(F(2,1),F(1,2),F(2,2)\)同理。

我们发现差分实际上跟矩形的四个顶点有关系,我们只对每个点求其是多少个矩形的右下/右上/左下/左上顶点即可。经典问题,单调栈就能做到\(O(n^2)\),统计答案的时候需要快速幂,于是复杂度是\(O(n^2\log k)\)http://zhengruioi.com/submission/212100

显然的dp是,\(dp_i=1+\sum_{j=1}^{i-1}S_{i,j}dp_j\),其中\(S_{i,j}\)表示矩形\(i\)和矩形\(j\)交的的面积。

一个显然的等价转化,求出\(dp_j\)后将矩阵\(j\)都加上\(dp_j\),求\(dp_i\)的时候只需要求矩形\(i\)的和;显然可以CDQ分治后转化为一个二维数点问题,一个小trick是将加转化为后缀加,查询的时候前缀查,可以省去一定程度上的讨论,复杂度是\(O(n\log^2 n)\)http://zhengruioi.com/submission/209812

猜你喜欢

转载自www.cnblogs.com/asuldb/p/12288775.html