Luogu5069 [Ynoi2015] 纵使日薄西山
题意:对于序列
选择
记
维护一个长为
先不考虑修改,思考如何求出
观察:若我们操作了
其他可能的操作均不再会影响
不妨将过程等价地改为:每次选出最靠左的最大值
于是答案就是所有被操作的位置的和。
进一步观察,对于单调不增的序列,被操作的下标是所有奇数。
对于一般的序列,我们将其看成若干段单调序列。
对于“山峰”,必然有贡献。
对于“山坡”上的点,下标奇偶性与对应“山峰”相同的位置有贡献。
对于“山谷”,必须奇偶性与相邻的两个山峰都相同才有贡献。
用树状数组分别维护奇下标与偶下标的部分和。用 std::set
维护山峰和山谷。
复杂度
本题对时间常数的要求较为宽松,可以适当简化代码。