如何判定结果序列能否构造出来。不太好直接想出来,先考虑构造过程会有什么性质。
对于一个栈,我们发现只需要关心其相对大小关系。
- \(*<<\) 这个时候相当于归并
- \(*><\) 这个时候发现如果取出第一个数,那么接着取出第二个数,等价于将第一个数和第二个数绑定,然后变成 \(*<\) 或者继续变成 \(*\)。\(<><\)同理,变成 \(*<\)。
- \(*>>\) 变成 \(*\)。
而归并得到的实际上是升序序列,如果出现突然下降,说明绑定出现了。而实际上所有的绑定是容易找出的。非前缀最大值的部分就是绑定。
而一个栈根据上面的分析,能给出 \(3\) 个 \(0\) 绑定;\(1\) 个 \(2\) 绑定;\(1\) 个 \(0\) 绑定和 \(1\) 个 \(1\) 绑定。
发现只要满足 \(1\) 绑定个数不大于 \(0\) 绑定个数即可。
\(f_{i,j}\) 表示考虑了 \(i\) 个数,\(0\) 绑定个数 \(-1\) 绑定个数 \(=j\)。枚举接下来是那个绑定。复杂度为 \(O(n^2)\).
标签:绑定,个数,AGC043D,构造,升序,序列 From: https://www.cnblogs.com/1l2u3o/p/18389818