NOIP 2022 题解(个人)

\(T1\) 种花

可以维护每一个点向下最多延伸多长 \(xia_i\),向右延伸最多多长 \(you_i\),这样 C 就好求了,可以维护 \(you_i\) 一个自下而上的后缀和。

至于 F 就维护一个 \(xia_i \times you_i\) 的自下而上的后缀和,跟 C 类似。

\(T2\) 喵了个喵

先考虑 \(k=2n−2\) 时怎么做,考虑留出一个空栈,剩下的每个栈放两个不同元素,来了一个元素 \(t\),如果 \(t\) 在栈顶,那么直接消去,否则将 \(t\) 放在空栈中再消去。

接下来考虑 \(k=2n−1\) 时,首先按照上面的方法,一直到所有栈中存在 \(2n−2\) 个元素,并且此时又来了一个栈中没有的元素 \(t\),考虑有以下解决方案:

\(t\) 下一次出现之前,没有任何一个栈底元素出现过,那么可以放在空栈,直到再次出现直接消去。

存在一个栈,设栈底为 \(x\),栈顶为 \(y\),\(x\) 的下一次出现比y下一次出现早,这就可以把t放在这个栈最顶上,直到栈底出现并消去。

否则,现在所有栈都是先出现栈顶再出现栈底,这时把 \(t\) 放在空栈,找到一个栈底元素最先出现的栈(所以此栈底出现之前全部为栈顶元素),钦定其为新的空栈,把他的栈顶y消去之后别的 \(y\) 元素都放在 \(t\) 的那个栈里,然后其余的栈位置全部不变,直到新空栈的栈底元素出现。

在上面的情况进行时,一定不会再出现一个新的元素,因为所有的新元素都已经在栈内了。

\(T3\) 建造军营

首先跑边双缩点,最后成一棵树。

容易发现一种合法的方案在树上相当于所有选的点在一个边连通块内。

\(f_i\) 为以 \(i\) 为最高点的方案数。

这样的连通块有两种转移:

第一种是 \(i\) 只连接一个子树,这种情况i内部的点不能一个都不选。

第二种是 \(i\) 连接至少两个子树,这种情况i内部的点可以选择任意个。

转移时我们不考虑第一个限制,但是统计答案需要考虑。

然后再考虑边的方案,最开始无限制的时候边有 \(2m\) 种方案,然后每强制选择一条边就会失去一半的方案,所以选一条边就要把方案数除以 \(2\)

\(T4\) 比赛

\(A(l,r)=max(a_l,a_{l+1},⋯,a_r),B(l,r)=max(b_l,b_{l+1},⋯,b_r)\)

首先考虑线段树扫描线,设当前扫到r,线段树每个下标l,代表左端点为l的答案之和,即 \(\sum ^r_{i=l}A(l,i) \times B(l,i)\).

利用单调栈求出每个数向左能影响到哪。

然后我们发现,每次右移指针相当于给所有节点的值 \(+=X \times Y\),相当于维护历史和,这可以用矩阵来实现,对于每一个线段树节点对应一个矩阵,然后赋值 \(X\),赋值 \(Y\)。但是这个玩应常数太大了,于是我们可以直接简化矩阵乘法,维护系数即可。

posted @ 2022-12-15 09:29  Naitoah  阅读(139)  评论(0)    收藏  举报