pkusc2021
D1T1
给一个 \(n\times n\) 矩阵,进行 \(k\) 轮操作,每次同时把 \(a_{i,j}\) 赋值成 \(i\) 这行加上 \(j\) 这列的和,注意自己会贡献两遍。
求出 \(k\) 次变化之后的矩阵,对 \(p\) 取模。
\(1\le n\le 1000,0\le k\le 10^9,2\le p\le 10^9\)。
这不是我们 pkusc2023 试机题吗?
这个大眼一看,感觉像找规律。然后你稍微手算几次,你发现每个数被算的次数,只会分成三类。那你就设这三个系数分别是 \([a,b,c]\),你考虑一次转移是怎样的。这个过于简单了,我也懒得再推一遍。
D1T2
长度为 \(n\) 序列,每次给区间 \([l,r]\),执行两种操作之一:
\(i\) 从 \(l\) 到 \(r-1\) 循环,\(a_i\leftarrow \max(a_i,a_{i+1})\)。
查询区间前缀 \(\max\) 单调栈元素和。
这个东西,感觉之前好像看到过。某个 Ynoi 好像用了类似的想法。
我们考虑维护连续颜色段,然后你发现,在假定对全局进行操作的前提下,每个段会有三种状态 \(+1/0/-1\),表示进行一次操作之后,这个段长度的变化。你发现这个状态不会来回跳,只可能 \(+1\rightarrow0\rightarrow-1\)。这样,我们可以使用平衡树维护这个东西,然后对于一次区间操作,我们暴力取出左右端点特殊考虑,中间部分直接打标记。
接下来你需要考虑两个问题:一个段的状态可能改变、一个段可能被删完了。
你发现一个段状态改变只可能在它前后段被删完之后发生,所以我们只需要考虑段被删完的情况,然后暴力判断就行了。
那我们额外维护一个段长的最小值,然后暴力 dfs 下去,暴力删除就可以。这样均摊复杂度是正确的。
最后,考虑怎么做询问操作。我们查出来这个区间的两个端点目前都是什么颜色,然后在平衡树上做楼房重建就可以了。
总复杂度应该是 \(O(n\log^2 n)\),写起来估计很痛苦。
但是好像有一些很厉害的做法。

浙公网安备 33010602011771号