AtCoder Beginner Contest 379
C
妙妙贪心题,居然需要高斯求和公式。
D
妙妙套路题,维护全局 lazytag,easy to solve.
E
妙妙拆贡献题,推一下公式:
\[\begin{aligned}
\sum_{l = 1}^{n} \sum_{r = l}^{n} f(l, r) &= \sum_{l = 1}^{n} \sum_{r = l}^{n} \sum_{i = l}^{r} 10^{r - i} a_i \\
&= \sum_{i = 1}^{n} a_i \sum_{l = 1}^{i} \sum_{r = i}^{n} 10^{r - i} \\
&= \sum_{i = 1}^{n} i a_i \sum_{r = i}^{n} 10^{r - i} \\
&= \sum_{i = 1}^{n} i a_i (10^0 + 10^1 + 10^2 + \dots + 10^{n - i}) \\
\end{aligned}
\]
也就是说, \(a_i\) 的贡献就是给答案的第 \(0, 1, \dots, n - i\) 位都加上一个 \(i a_i\)。
Prob could be solved in \(O(n)\)。
F
状压,正解是轮廓线 DP。
妙妙 DS 题。
单调栈 + 树状数组。
找到每个数左边第一个大于它的数,记为 \(L_i\)。我们可以这样来约束能被看到的建筑物:
- 位于 \([l, r]\) 右边
- 满足题目中的限制,只对于 \(l\)
为什么限制只剩下 \(l\) 了呢?因为 \(l\) 能看到的 \(r\) 都能看到,\(l\) 看到某个建筑物 \(i\) 的条件是 \((l, i)\) 中没有 \(h \gt h_i\),也就是 \(i\) 左边第一个大于 \(i\) 的数必须不超过 \(l\)。
离线下询问,把询问挂在右端点上,倒序枚举 \(r\),用树状数组维护前文所述 \(L_i\) 的限制,查询用前缀和。