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]\),执行两种操作之一:

  1. \(i\)\(l\)\(r-1\) 循环,\(a_i\leftarrow \max(a_i,a_{i+1})\)

  2. 查询区间前缀 \(\max\) 单调栈元素和。

这个东西,感觉之前好像看到过。某个 Ynoi 好像用了类似的想法。

我们考虑维护连续颜色段,然后你发现,在假定对全局进行操作的前提下,每个段会有三种状态 \(+1/0/-1\),表示进行一次操作之后,这个段长度的变化。你发现这个状态不会来回跳,只可能 \(+1\rightarrow0\rightarrow-1\)。这样,我们可以使用平衡树维护这个东西,然后对于一次区间操作,我们暴力取出左右端点特殊考虑,中间部分直接打标记。

接下来你需要考虑两个问题:一个段的状态可能改变、一个段可能被删完了。

你发现一个段状态改变只可能在它前后段被删完之后发生,所以我们只需要考虑段被删完的情况,然后暴力判断就行了。

那我们额外维护一个段长的最小值,然后暴力 dfs 下去,暴力删除就可以。这样均摊复杂度是正确的。

最后,考虑怎么做询问操作。我们查出来这个区间的两个端点目前都是什么颜色,然后在平衡树上做楼房重建就可以了。

总复杂度应该是 \(O(n\log^2 n)\),写起来估计很痛苦。

但是好像有一些很厉害的做法。

posted @ 2024-01-24 17:10  PYD1  阅读(5)  评论(0)    收藏  举报