首页 > 其他分享 >Luogu7093

Luogu7093

时间:2022-11-22 18:25:14浏览次数:48  
标签:队列 双端 sum 元素 队首 序列 Luogu7093

题意:

给你一个双端队列,同时有一个长度为 \(n\) 的序列 \(a\),满足序列中的元素均为 \(2\) 的非负整数幂。

从前到后遍历这个序列,对于一个 \(a_i\) 你可以将它放入双端队列的队首或是队尾。如果队列中出现两个相邻元素值相同,那么它们就会被合并成它们的和。

问最后是否存在方案使得队列最后只剩一个元素。存在输出方案。

数据范围:\(n \le 1000,\sum{a_i} \le 2^{13}\)。

思路:

考虑到双端队列中如果存在三个相邻元素 \(a,b,c\) 满足 \(a>b<c\),那么 \(a\) 和 \(c\) 最终一定无法合并。

所以合法方案中的双端队列的元素一定单峰的。

我们把它以峰的位置劈成两半,然后每一半就都是单调的,可以直接用一个长度不超过 \(2^{13}\) 次方的数来表示。

令 \(f(i,j,k)\) 表示当前 \(1 \sim i\) 的元素入队,队列一半是 \(j\),一半是 \(k\)。

转移就直接枚举 \(a_{i+1}\) 放左边还是右边就行了,可以用 \(\operatorname{lowbit}\) 快速得到队首和队尾的值,加入直接 \(j \gets j+a_{i+1}\) 或 \(k \gets k + a_{i+1}\) 即可。

注意峰值改变要特殊处理。

最后发现 \(j+k=\sum_{p=1}^{i} a_p\),所以可以直接省掉一维。

时间复杂度 \(\Theta(n \sum{a_i})\)。

标签:队列,双端,sum,元素,队首,序列,Luogu7093
From: https://www.cnblogs.com/zzzYheng/p/16916031.html

相关文章