隔了好久好久。。。
T1
题意:给定一棵 $n\times m$ 的 01 矩阵,问有多少个由 1 组成形如 C
和形如 F
的图案。
C
与 F
做法是类似的,此处只讨论 F
。
考虑处理出每个位置向右延伸以及向下延伸的最大值。再枚举每一列统计答案即可,时间复杂度 $\mathcal O(nm)$。
最后注意乘上给定常数 $C,F$。(警钟敲烂)
T2
T3
T4
题意:给定两个长度为 $n$ 的序列 $A,B$。有 $q$ 次询问 $l,r$,每次询问 $\sum_{l\le p\le q\le r} \max_{i=p}^q A_i\times \max_{i=p}^q B_i$。
考虑将询问离线下来,对右端点 $r$ 直接扫描线,每次将其放进单调栈里,找到最远能影响到的位置。继而维护前面每个位置的答案。
现在就相当于需要维护答案的历史版本之和。我们需要支持三种操作:
1.将 $a$ 区间滚平为 $x$;
2.将 $b$ 区间滚平为 $x$;
3.每个位置加上 $a_i\times b_i$。
但是具体如何用线段树维护?线段树节点上我们需要维护答案 $sum$,以及 $sumx,sumy,sumxy$ 表示 $\sum x,\sum y,\sum xy$。tag 上我们需要维护 $sx,sy$ 表示区间滚平,以及 $addx,addy,addxy,addz$ 表示 $sum’=sum+addx\times sumx+addy\times sumy+addxy\times sumxy+addz\times len$。tag 的意义即为当前节点的 $sum$ 需要加上 $sumx,sumy,sumxy,len$ 分别乘上其 tag 上所对应的系数的和。根据这个意义可以写出 tag 的合并方式。需要注意到是要先累加后滚平。具体代码可以看 https://loj.ac/s/1720904 。还有一种写法即为写成矩阵的形式,不过常数会大一些。