Liveddd's Blog

愛にできることはまだあるかい

NOIP 2022 全题解

隔了好久好久。。。

T1

题意:给定一棵 $n\times m$ 的 01 矩阵,问有多少个由 1 组成形如 C 和形如 F 的图案。

CF 做法是类似的,此处只讨论 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 。还有一种写法即为写成矩阵的形式,不过常数会大一些。